home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / fsw / zm302 / zm302_s.lzh / ZP.HAS < prev    next >
Text File  |  1997-04-16  |  102KB  |  4,813 lines

  1. *-------------------------------------------------------
  2. *         Z-MUSIC.X演奏制御プログラム
  3. *
  4. *            ZP.R Version 3.0
  5. *
  6. *        PROGRAMMED  BY  Z.NISHIKAWA
  7. *
  8. *-------------------------------------------------------
  9.     .include    ZMD.mac
  10.     .include    iocscall.mac
  11.     .include    doscall.mac
  12.     .include    LzzConst.MAC
  13.     .include    zmcall.mac
  14.     .include    zmid.mac
  15.     .include    z_global.mac
  16.     .include    label.mac
  17.     .include    version.mac
  18.     .offset    0
  19.     .include    zm_stat.mac
  20.     .offset        0
  21.     .include    common.mac
  22.     .text
  23.     .list
  24.     .lall
  25. max_p:        equ    128    *juke boxで演奏出来る最大曲数
  26. fn_size:    equ    92    *1ファイルネームバッファの大きさ
  27. setup1:        equ    fn_size*0
  28. setup2:        equ    fn_size*1
  29. setup3:        equ    fn_size*2
  30. setup4:        equ    fn_size*3
  31.  
  32. Z_MUSIC    macro    func        *ドライバへのファンクションコール
  33.     moveq.l    func,d0
  34.     trap    #3
  35.     endm
  36.  
  37. bitsns    macro    n        *IOCS    _BITSNSと同等に機能する
  38.     move.b    $800+n.w,d0
  39.     endm
  40.  
  41. sftsns    macro    dreg
  42.     move.w    $810.w,dreg
  43.     endm
  44.  
  45. top:
  46.     bra    program_start
  47. version_id:    ds.b    8    *バージョン情報格納エリア
  48.                 *常駐部分
  49. start:
  50. int_entry_j:                *割り込みエントリーその1(JUKE BOX)
  51. *reglist    reg    d0-d5/a0-a3/a5-a6
  52. reglist    reg    d0-d7/a0-a6
  53.     movem.l    reglist,-(sp)
  54.     lea    zp_work(pc),a6
  55.     subq.w    #1,blank_count-zp_work(a6)    *ブランクタイム処理
  56.     bcs    @f
  57.     bne    quit_int_j
  58. @@:
  59.     move.w    #1,blank_count-zp_work(a6)
  60.  
  61.     btst.b    #3,$e84080
  62.     bne    quit_int_j        *DMAが活動中は何も処理をしない(念のため)
  63.     cmpi.b    #-1,music_no-zp_work(a6)
  64.     beq    quit_int_j        *なにも演奏するものがない
  65.  
  66.     tas.b    _int_flag-zp_work(a6)
  67.     bne    quit_int_j
  68.  
  69.     tst.b    hajimete-zp_work(a6)
  70.     bmi    chk_next
  71.  
  72.     lea    key_tbl_jk(pc),a0
  73.     lea    $800.w,a1
  74.  
  75.     bsr    key_inp            *[shift]+[opt1]
  76.     beq    @f
  77.     bsr    jk_im_next
  78.     bra    chk_next
  79. @@:
  80.     clr.b    sft_opt1-zp_work(a6)
  81.  
  82.     bsr    key_inp            *[shift]+[opt2]
  83.     beq    @f
  84.     bsr    jk_fo_next
  85.     bra    chk_next
  86. @@:
  87.     clr.b    sft_opt2-zp_work(a6)
  88.  
  89.     bsr    key_inp            *[shift]+[ctrl]
  90.     beq    @f
  91.     bsr    jk_stop_cont
  92.     bra    chk_next
  93. @@:
  94.     clr.b    sft_ctrl-zp_work(a6)
  95.  
  96.     bsr    key_inp            *[shift]+[xf4]
  97.     beq    @f
  98.     bsr    jk_im_play_again
  99.     bra    chk_next
  100. @@:
  101.     clr.b    jk_im_play_k-zp_work(a6)
  102.  
  103.     bsr    key_inp            *[shift]+[xf5]
  104.     beq    @f
  105.     bsr    jk_fo_play_again
  106.     bra    chk_next
  107. @@:
  108.     clr.b    jk_fo_play_k-zp_work(a6)
  109.  
  110.     bsr    key_inp            *[ctrl]+[opt1]
  111.     beq    @f
  112.     bsr    jk_im_back
  113.     bra    chk_next
  114. @@:
  115.     clr.b    ctrl_opt1-zp_work(a6)
  116.  
  117.     bsr    key_inp            *[ctrl]+[opt2]
  118.     beq    @f
  119.     bsr    jk_fo_back
  120.     bra    chk_next
  121. @@:
  122.     clr.b    ctrl_opt2-zp_work(a6)
  123. chk_next:                *次の曲へ移るかどうかチェック
  124.     tst.b    fdr_flg-zp_work(a6)    *マスターフェーダーを実行中か
  125.     beq    2f
  126.     bpl    1f                *演奏の停止
  127.     Z_MUSIC    #ZM_GET_FADER_STATUS
  128.     tst.b    d0
  129.     bpl    @f                *マスターフェーダーは中止あるいは完了した
  130.     btst.l    #1,d0
  131.     beq    2f                *マスターフェーダーはまだ動作中
  132.     move.b    #1,fdr_flg-zp_work(a6)        *次は演奏停止
  133.     move.w    blank_time(pc),blank_count-zp_work(a6)    *ブランクタイムを設定
  134.     bra    bye_int
  135. 1:                        *演奏停止フェーズ
  136.     suba.l    a1,a1
  137.     Z_MUSIC    #ZM_STOP
  138. @@:
  139.     clr.b    fdr_flg-zp_work(a6)            *pl:マスターフェーダーは終了していた
  140.     move.w    #$ffff,next_flg-zp_work(a6)        *いよいよ次の曲へ
  141.     move.w    blank_time(pc),blank_count-zp_work(a6)    *ブランクタイムを設定
  142.     bra    bye_int
  143. 2:
  144.     tst.b    next_flg-zp_work(a6)            *フラグが寝てるから次の曲へ移らない
  145.     beq    bye_int
  146.  
  147.     tst.b    hajimete-zp_work(a6)
  148.     bpl    @f
  149.     bsr    hajimete_ope
  150.     bra    set_param
  151. @@:
  152.     clr.b    next_flg-zp_work(a6)
  153.     not.b    next_flg2-zp_work(a6)
  154.     bpl    set_param
  155.     bsr    goto_fadeout    *next_flg2=$ff : フェードアウトを行う
  156.     bra    bye_int        *next_flg2=$00 : 次の曲を演奏する
  157. set_param:
  158.     moveq.l    #0,d4
  159.     move.b    music_no(pc),d4
  160.     move.l    d4,d5
  161.     add.w    d4,d4
  162.     add.w    d4,d4        *4倍
  163.     lea    data_addr_tbl(pc),a5
  164.     add.w    d4,a5
  165.     addq.b    #1,music_no-zp_work(a6)
  166.     tst.l    4(a5)
  167.     bne    @f
  168.     move.b    one_loop(pc),music_no-zp_work(a6)    *始めに戻す
  169. @@:
  170.     move.l    (a5),a5
  171.     move.l    a5,a3        *save a5 into a3
  172.     move.l    (a5),d0
  173.     beq    ope_zmd        *ZMDデータのみだから即演奏
  174. _jkbx_lp:
  175.     move.l    d0,a5
  176.  
  177.     move.l    4(a5),d3
  178.     bne    ope_mdd        *case:MDD
  179.     tst.l    12(a5)        *address mode?
  180.     beq    zpd_adr_mode
  181.     lea.l    8(a5),a1    *a1=top address
  182. zpd_header_check:
  183.     move.l    (a1)+,d1        *ZPD ID
  184.     cmpi.l    #ZPD_PDX,d1
  185.     beq    @f
  186.     addq.w    #8,a1            *header skip
  187. @@:
  188.     Z_MUSIC    #ZM_SET_ZPD_TABLE    *ZPDテーブルの登録
  189.     bra    more_?
  190. zpd_adr_mode:
  191.     move.l    12(a5),a1        *a1.l=top address
  192.     bra    zpd_header_check
  193. ope_mdd:
  194.     * < d3.l=MDD size
  195.     move.l    d3,d2        *d2=size
  196.     tst.l    12(a5)        *address mode?
  197.     beq    mdd_adr_mode
  198.     lea.l    8(a5),a1    *MDD address
  199. mdd_header_check:
  200.     move.l    (a1)+,d1    *d1=I/F number
  201.     cmp.l    #SMFHED,(a1)
  202.     beq    @f
  203.     moveq.l    #0,d2        *ascii mode
  204. @@:
  205.     Z_MUSIC    #ZM_MIDI_TRANSMISSION
  206.     bra    more_?
  207. mdd_adr_mode:
  208.     move.l    12(a5),a1
  209.     bra    mdd_header_check
  210. more_?:
  211.     move.l    (a5),d0
  212.     bne    _jkbx_lp
  213. ope_zmd:
  214.     lea    loop_tbl(pc),a0
  215.     moveq.l    #0,d2
  216.     move.b    (a0,d5.w),d2        *d3.b=次の曲のループ回数
  217.     lea    event_table(pc),a1    *ジャンプ先
  218.     move.l    d2,4(a1)        *ループ回数セット
  219.     moveq.l    #%0011_1000,d1
  220.     Z_MUSIC    #ZM_OBTAIN_EVENTS    *飛先やループ回数を登録
  221.  
  222.     lea    trk_seq_tbl(pc),a1            *マスターフェーダー初期化
  223.     move.l    #$ffff_07_00+fader_dflt_spd,(a1)    *dev,omt,spd.h
  224.     move.l    #$00_80_80_00,4(a1)            *spd.l,start,end,dummy
  225.     Z_MUSIC    #ZM_MASTER_FADER
  226.  
  227.     lea.l    8+8(a3),a1    *header skipped ZMD address
  228.     moveq.l    #0,d2        *高速応答モードで演奏
  229.     Z_MUSIC    #ZM_PLAY_ZMD
  230. bye_int:
  231.     clr.b    _int_flag-zp_work(a6)
  232. quit_int_j:
  233.     movem.l    (sp)+,reglist
  234.     rts
  235.  
  236. jk_im_next:
  237.     tst.b    sft_opt1-zp_work(a6)
  238.     bne    @f
  239.     st.b    sft_opt1-zp_work(a6)
  240.     move.w    #$ffff,next_flg-zp_work(a6)    *next_flg=$ff    *強制的に次の曲へ移る
  241. @@:                        *next_flg2=$ff    *すぐに…
  242.     rts
  243.  
  244. jk_fo_next:
  245.     tst.b    sft_opt2-zp_work(a6)
  246.     bne    @f
  247.     st.b    sft_opt2-zp_work(a6)
  248.     move.w    #$ff00,next_flg-zp_work(a6)    *next_flg=$ff    *強制的に次の曲へ移る
  249. @@:                        *next_flg2=$00    *フェードアウトしてから…
  250.     rts
  251.  
  252. jk_stop_cont:                *一時停止?
  253.     tst.b    sft_ctrl-zp_work(a6)
  254.     bne    @f
  255.     st.b    sft_ctrl-zp_work(a6)
  256.     not.b    stop_cont-zp_work(a6)
  257.     bne    jk_stop
  258.     suba.l    a1,a1
  259.     Z_MUSIC    #ZM_CONT
  260. @@:
  261.     rts
  262.  
  263. jk_stop:
  264.     suba.l    a1,a1
  265.     Z_MUSIC    #ZM_STOP
  266.     rts
  267.  
  268. jk_im_play_again:
  269.     tst.b    jk_im_play_k-zp_work(a6)
  270.     bne    @f
  271.     st.b    jk_im_play_k-zp_work(a6)
  272.     Z_MUSIC    #ZM_PLAY_AGAIN
  273. @@:
  274.     rts
  275.  
  276. jk_fo_play_again:
  277.     tst.b    jk_fo_play_k-zp_work(a6)
  278.     bne    @f
  279.     st.b    jk_fo_play_k-zp_work(a6)
  280.     move.w    #$ff00,next_flg-zp_work(a6)
  281.     subq.b    #1,music_no-zp_work(a6)
  282.     bcs    jk_no_rev
  283. @@:
  284.     rts
  285.  
  286. jk_im_back:
  287.     tst.b    ctrl_opt1-zp_work(a6)
  288.     bne    @b
  289.     st.b    ctrl_opt1-zp_work(a6)
  290.     move.w    #$ffff,next_flg-zp_work(a6)    *next_flg=$ff    *強制的に次の曲へ移る
  291.     bra    @f                *next_flg2=$ff    *すぐに…
  292. jk_fo_back:
  293.     tst.b    ctrl_opt2-zp_work(a6)
  294.     bne    @b
  295.     st.b    ctrl_opt2-zp_work(a6)
  296.     move.w    #$ff00,next_flg-zp_work(a6)    *next_flg=$ff    *強制的に次の曲へ移る
  297. @@:                        *next_flg2=$00    *フェードアウトしてから…
  298.     subq.b    #2,music_no-zp_work(a6)
  299.     bcc    @f
  300. jk_no_rev:
  301.     move.b    juke_max(pc),d0
  302.     addq.b    #1,d0
  303.     add.b    d0,music_no-zp_work(a6)
  304.     move.b    music_no-zp_work(a6),d0
  305.     cmp.b    juke_max(pc),d0
  306.     bls    @f
  307.     clr.b    music_no-zp_work(a6)
  308. @@:
  309.     rts
  310.  
  311. hajimete_ope:            *初めての時はここへ
  312.     clr.b    hajimete-zp_work(a6)
  313.     clr.b    next_flg-zp_work(a6)
  314.     rts
  315.  
  316. goto_fadeout:            *フェードアウトをする
  317.     lea    trk_seq_tbl(pc),a1
  318.     move.l    #$ffff_07_00,d0            *dev,omt,(spd.h)
  319.     move.b    fadeout_speed(pc),d0        *spd.h
  320.     move.l    d0,(a1)                *dev,omt,spd.h
  321.     move.l    #$00_80_00_00,4(a1)        *(spd.l),start,end,dummy
  322.     move.b    fadeout_speed+1(pc),4(a1)    *spd.l
  323.     Z_MUSIC    #ZM_MASTER_FADER
  324.     st.b    fdr_flg-zp_work(a6)
  325.     rts
  326.  
  327. set_next_flg_ed:        *演奏が終了するとZ-MUSICからここへ来る
  328.     move.w    sr,-(sp)
  329.     ori.w    #$0700,sr
  330.     move.l    a0,-(sp)
  331.     lea    next_flg(pc),a0    *next_flg=$ff
  332.     move.w    #$ffff,(a0)    *next_flg2=$ff フェードアウトしないで次へ行くようにマーク
  333.     move.w    blank_time(pc),blank_count-next_flg(a0)    *ブランクタイムを再設定
  334.     move.l    (sp)+,a0
  335.     move.w    (sp)+,sr
  336.     rts
  337.  
  338. set_next_flg_lp:        *ループ条件が満たされるとZ-MUSICからここへ来る
  339.     move.w    sr,-(sp)
  340.     ori.w    #$0700,sr
  341.     move.l    a0,-(sp)
  342.     lea    next_flg(pc),a0    *next_flg=$ff
  343.     move.w    #$ff00,(a0)    *next_flg2=$00    フェードアウトへ
  344.     move.l    (sp)+,a0
  345.     move.w    (sp)+,sr
  346.     rts
  347.  
  348. int_entry_k:            *割り込みエントリーその2(DEBUG MODE)
  349. *reglist    reg    d0-d1/a0-a1/a6
  350. reglist    reg    d0-d7/a0-a6
  351.     movem.l    reglist,-(sp)
  352.     lea    zp_work(pc),a6
  353.     tas.b    _int_flag-zp_work(a6)
  354.     bne    quit_int_k
  355.  
  356.     Z_MUSIC    #ZM_GET_ZMSC_STATUS        *>a0.l=zmusic_stat
  357.     bclr.b    #pf_PLAY,perform_flg(a0)
  358.     beq    @f
  359.     clr.b    stop_mode-zp_work(a6)
  360. @@:
  361.     lea    key_tbl_db(pc),a0
  362.     lea    $800.w,a1
  363.  
  364.     bsr    key_inp
  365.     beq    @f
  366.     bsr    _PLAY        *演奏開始(xf4)
  367.     bra    __exit
  368. @@:
  369.     clr.b    play_k-zp_work(a6)
  370.  
  371.     bsr    key_inp
  372.     beq    @f
  373.     bsr    _PAUSE        *一時停止(opt1)
  374.     bra    __exit
  375. @@:
  376.     clr.b    stop_k-zp_work(a6)
  377.  
  378.     bsr    key_inp
  379.     beq    @f
  380.     bsr    _CONT        *一時停止解除(opt2)
  381.     bra    __exit
  382. @@:
  383.     clr.b    cont_k-zp_work(a6)
  384.  
  385.     bsr    key_inp
  386.     beq    @f
  387.     bsr    _FF        *早送り(xf5)
  388.     bra    __exit
  389. @@:
  390.     bsr    key_inp
  391.     beq    @f
  392.     bsr    _SLOW        *低速演奏
  393.     bra    __exit
  394. @@:
  395.     bsr    key_inp        *FADEOUT(xf1)
  396.     beq    @f
  397.     bsr    _FADEOUT
  398.     bra    __exit
  399. @@:
  400.     clr.b    fadeout_k-zp_work(a6)
  401.  
  402.     bsr    key_inp        *FADE IN(xf2)
  403.     beq    @f
  404.     bsr    _FADE_IN
  405.     bra    __exit
  406. @@:
  407.     clr.b    fadein_k-zp_work(a6)
  408. chk_FF:
  409.     tst.b    _FF_flg-zp_work(a6)    *早送り終了か?
  410.     beq    chk_SLOW
  411.     lea    trk_seq_tbl(pc),a1
  412.     move.l    #$ffff_07_00+fader_dflt_spd,(a1)    *dev,omt,spd.h
  413.     move.l    #$00_80_80_00,4(a1)            *spd.l,start,end,dummy
  414.     Z_MUSIC    #ZM_MASTER_FADER
  415.     clr.b    _FF_flg-zp_work(a6)
  416.     bra    @f
  417. chk_SLOW:
  418.     tst.b    _SLOW_flg-zp_work(a6)    *低速演奏か?
  419.     beq    __exit
  420. @@:
  421.     moveq.l    #0,d1
  422.     Z_MUSIC    #ZM_CONTROL_TEMPO    *通常テンポに戻す
  423.     clr.b    _SLOW_flg-zp_work(a6)
  424. __exit:
  425.     clr.b    _int_flag-zp_work(a6)
  426. quit_int_k:
  427.     movem.l    (sp)+,reglist
  428.     rts
  429.  
  430. key_inp:            *キー入力
  431.     * > nz key on
  432.     * > ze key off
  433.     move.b    (a0)+,d0    *key group
  434.     move.b    d0,d1
  435.     andi.w    #$0f,d0
  436.     lsr.b    #4,d1        *key status bit
  437.     btst.b    d1,(a1,d0.w)
  438.     beq    @f
  439.     move.b    (a0)+,d0    *key group
  440.     move.b    d0,d1
  441.     andi.w    #$0f,d0
  442.     lsr.b    #4,d1        *key status bit
  443.     btst.b    d1,(a1,d0.w)
  444.     rts
  445. @@:
  446.     addq.w    #1,a0
  447.     moveq.l    #0,d0
  448.     rts
  449.  
  450. _PAUSE:                *一時停止
  451.     tas.b    stop_k-zp_work(a6)
  452.     bmi    @f
  453.     tas.b    stop_mode-zp_work(a6)
  454.     bmi    do_cont
  455.     suba.l    a1,a1
  456.     Z_MUSIC    #ZM_STOP
  457. @@:
  458.     rts
  459.  
  460. _CONT:                *一時停止解除
  461.     tas.b    cont_k-zp_work(a6)
  462.     bmi    @f
  463. *    tst.b    stop_mode-zp_work(a6)
  464. *    beq    @f        *演奏は停止していない
  465. do_cont:
  466.     suba.l    a1,a1
  467.     Z_MUSIC    #ZM_CONT
  468.     clr.b    stop_mode-zp_work(a6)
  469. @@:
  470.     rts
  471.  
  472. _PLAY:                *演奏開始
  473.     tas.b    play_k-zp_work(a6)
  474.     bmi    @f
  475.     Z_MUSIC    #ZM_PLAY2
  476.     clr.b    stop_mode-zp_work(a6)
  477. @@:
  478.     rts
  479.  
  480. _FADE_IN:
  481.     tas.b    fadein_k-zp_work(a6)
  482.     bmi    @f
  483.     lea    trk_seq_tbl(pc),a1
  484.     move.l    #$ffff_07_00,d0            *dev,omt,(spd.h)
  485.     move.b    fadein_speed(pc),d0        *spd.h
  486.     move.l    d0,(a1)                *dev,omt,spd.h
  487.     move.l    #$00_00_80_00,4(a1)        *(spd.l),start,end,dummy
  488.     move.b    fadein_speed+1(pc),4(a1)    *spd.l
  489.     Z_MUSIC    #ZM_MASTER_FADER
  490. @@:
  491.     rts
  492.  
  493. _FADEOUT:
  494.     tas.b    fadeout_k-zp_work(a6)
  495.     bmi    @f
  496.     lea    trk_seq_tbl(pc),a1
  497.     move.l    #$ffff_07_00,d0            *dev,omt,(spd.h)
  498.     move.b    fadeout_speed(pc),d0        *spd.h
  499.     move.l    d0,(a1)                *dev,omt,spd.h
  500.     move.l    #$00_80_00_00,4(a1)        *(spd.l),start,end,dummy
  501.     move.b    fadeout_speed+1(pc),4(a1)    *spd.l
  502.     Z_MUSIC    #ZM_MASTER_FADER
  503. @@:
  504.     rts
  505.  
  506. _FF:                *早送り
  507.     tst.b    _SLOW_flg-zp_work(a6)            *低速演奏か?
  508.     bne    @f
  509.     tas.b    _FF_flg-zp_work(a6)
  510.     bne    @f
  511.     lea    trk_seq_tbl(pc),a1
  512.     move.l    #$ffff_07_00+fader_dflt_spd,(a1)    *dev,omt,spd.h
  513.     move.l    #$00_40_40_00,4(a1)            *spd.l,start,end,dummy
  514.     Z_MUSIC    #ZM_MASTER_FADER
  515.     moveq.l    #-1,d1
  516.     Z_MUSIC    #ZM_CONTROL_TEMPO
  517.     move.l    FF_timer(pc),d1                *M:$c0,B:$f8,A:$399
  518.     Z_MUSIC    #ZM_SET_TIMER_VALUE
  519. @@:
  520.     rts
  521.  
  522. _SLOW:                    *低速演奏
  523.     tst.b    _FF_flg-zp_work(a6)    *早送り終了か?
  524.     bne    @f
  525.     tas.b    _SLOW_flg-zp_work(a6)
  526.     bne    @f
  527.     moveq.l    #-1,d1
  528.     Z_MUSIC    #ZM_CONTROL_TEMPO
  529.     move.l    SL_timer(pc),d1
  530.     Z_MUSIC    #ZM_SET_TIMER_VALUE
  531. @@:
  532.     rts
  533.  
  534. release_zp:                    *演奏制御解除部
  535.     ori.w    #$0700,sr
  536.     lea    zp_work(pc),a6
  537.     suba.l    a1,a1
  538.     move.l    rel_zp_mark(pc),d1
  539.     Z_MUSIC    #ZM_APPLICATION_RELEASER    *解放ルーチンの登録解除
  540.     move.l    a0,d0
  541.     beq    unable_to_rel
  542.  
  543.     Z_MUSIC    #ZM_GET_ZMSC_STATUS        *>a0.l=zmusic_stat
  544.     bclr.b    #7,external_applications(a0)    *Debug mode off
  545.     bne    kctrl_release
  546. *juke_release:
  547.     bclr.b    #6,external_applications(a0)    *Juke box off
  548.     beq    unable_to_rel            *解除出来ない
  549.  
  550.     moveq.l    #0,d1
  551.     lea    int_entry_j(pc),a1
  552.     Z_MUSIC    #ZM_SET_INT_SERVICE
  553.     tst.l    d0
  554.     bne    unable_to_rel            *解除出来ない
  555.  
  556.     moveq.l    #0,d1                *dummy
  557.     Z_MUSIC    #ZM_INIT            演奏中のデータのメモリが解放されるから
  558.  
  559.     move.l    data_addr_tbl(pc),d0
  560.     beq    rlszp00
  561.     move.l    d0,-(sp)
  562.     DOS    _MFREE
  563.     addq.w    #4,sp
  564. rlszp00:
  565.     lea    release_mes(pc),a1
  566.     move.l    a0work(pc),a0        *解放アドレス
  567.     moveq.l    #0,d0            *no error
  568.     move.b    d0,version_id-release_mes(a1)
  569. exit_rlszp:
  570.     rts
  571.  
  572. kctrl_release:
  573.     moveq.l    #0,d1
  574.     lea    int_entry_k(pc),a1
  575.     Z_MUSIC    #ZM_SET_INT_SERVICE
  576.     tst.l    d0
  577.     beq    rlszp00
  578. unable_to_rel:                *解除不能ケース
  579.     lea    release_er_mes(pc),a1
  580.     suba.l    a0,a0
  581.     moveq.l    #-1,d0
  582.     bra    exit_rlszp
  583.  
  584.     if    (debug.and.1)
  585. debug2:                    *デバグ用ルーチン(レジスタ値を表示/割り込み対応)
  586.     move.w    sr,db_work2        *save sr    (サブルーチン_get_hex32が必要)
  587.     ori.w    #$700,sr        *mask int
  588.     movem.l    d0-d7/a0-a7,db_work
  589.  
  590.     moveq.l    #%0011,d1
  591.     IOCS    _B_COLOR
  592.  
  593.     lea    str__(pc),a1
  594.  
  595.     move.w    #$0d0a,(a1)+
  596.  
  597.     moveq.l    #8-1,d7
  598.     lea    db_work(pc),a6
  599. dbg2_lp01:
  600.     move.l    (a6)+,d0
  601.     bsr    _get_hex32
  602.     addq.w    #8,a1
  603.     cmpi.b    #4,d7
  604.     bne    @f
  605.     move.b    #' ',(a1)+
  606. @@:
  607.     move.b    #' ',(a1)+
  608.     dbra    d7,dbg2_lp01
  609.  
  610.     move.b    #$0d,(a1)+
  611.     move.b    #$0a,(a1)+
  612.  
  613.     moveq.l    #8-1,d7
  614. dbg2_lp02:
  615.     move.l    (a6)+,d0
  616.     bsr    _get_hex32
  617.     addq.w    #8,a1
  618.     cmpi.b    #4,d7
  619.     bne    @f
  620.     move.b    #' ',(a1)+
  621. @@:
  622.     move.b    #' ',(a1)+
  623.     dbra    d7,dbg2_lp02
  624.  
  625.     move.l    (a7),d0
  626.     bsr    _get_hex32
  627.     addq.w    #8,a1
  628. *    move.b    #$0d,(a1)+
  629. *    move.b    #$0a,(a1)+
  630.     clr.b    (a1)+
  631.     lea    str__(pc),a1
  632.     IOCS    _B_PRINT
  633. *@@:
  634. *    btst.b    #5,$806.w
  635. *    bne    @b
  636.  
  637.     movem.l    db_work(pc),d0-d7/a0-a7
  638.     move.w    db_work2(pc),sr    *get back sr
  639.     rts
  640.  
  641. _get_hex32:            *値→16進数文字列(4bytes)
  642.     * < d0=data value
  643.     * < a1=格納したいアドレス
  644.     * > (a1)=ascii numbers
  645.     * - all
  646.     movem.l    d0-d1/d4/a1,-(sp)
  647.     addq.w    #8,a1
  648.     clr.b    (a1)
  649.     moveq.l    #8-1,d4
  650. _gh_lp32:
  651.     move.b    d0,d1
  652.     andi.b    #$0f,d1
  653.     add.b    #$30,d1
  654.     cmpi.b    #'9',d1
  655.     bls    _its_hex32
  656.     addq.b    #7,d1
  657. _its_hex32:
  658.     move.b    d1,-(a1)
  659.     lsr.l    #4,d0
  660.     dbra    d4,_gh_lp32
  661.     movem.l    (sp)+,d0-d1/d4/a1
  662.     rts
  663.         *デバッグ用ワーク
  664.     .even
  665. str__:        ds.b    96*2
  666. db_work:    dcb.l    16,0        *for debug
  667. db_work2:    dc.l    0
  668.         dc.b    'REGI'
  669.     endif
  670.  
  671. key_tbl_db:    dc.b    $0e,$0b,$0e,$2e,$0e,$3e,$0e,$1b,$0e,$7a,$0e,$5a,$0e,$6a
  672. key_tbl_jk:    dc.b    $0e,$2e,$0e,$3e,$0e,$1e,$0e,$0b,$0e,$1b,$1e,$2e,$1e,$3e
  673. juke_max:    dc.b    0
  674. play_k:        dc.b    0
  675. stop_k:        dc.b    0
  676. stop_mode:    dc.b    0
  677. cont_k:        dc.b    0
  678. fadein_k:    dc.b    0
  679. fadeout_k:    dc.b    0
  680. hajimete:    dc.b    $ff    *初めてかどうか($ff=yes)
  681. stop_cont:    dc.b    0
  682. sft_ctrl:    dc.b    0
  683. sft_opt1:    dc.b    0
  684. sft_opt2:    dc.b    0
  685. jk_im_play_k:    dc.b    0
  686. jk_fo_play_k:    dc.b    0
  687. ctrl_opt1:    dc.b    0
  688. ctrl_opt2:    dc.b    0
  689. one_loop:    dc.b    0    *すべての曲を演奏したあとどうするか(0:初めに戻る,$ff:なにも演奏しない)
  690. lang:        dc.b    0    *言語モード(0:English,1:Japanese)
  691. release_mes:    dc.b    'ZP3.R has been released from your system.',13,10,0
  692.         dc.b    'ZP3.Rの常駐を解除しました',13,10,0
  693. release_er_mes:    dc.b    'ZP3.R is unable to release.',13,10,0
  694.         dc.b    'ZP3.Rは解除出来ません',13,10,0
  695.         .even
  696. next_flg:    dc.b    $ff    *次の曲へ移るかどうかフラグ    !!!順序変更禁止
  697. next_flg2:    dc.b    $00    *フェードアウトフラグ        !!!順序変更禁止
  698. music_no:    dc.b    0    *次回に演奏すべきデータナンバー
  699. fdr_flg:    dc.b    0    *フェーダーを実行しているか $ff:yes $01:演奏を停止する
  700. loop_tbl:    dcb.b    max_p,0
  701. _FF_flg:    dc.b    0
  702. _SLOW_flg:    dc.b    0
  703. _int_flag:    dc.b    0
  704.     .even
  705. fadeout_speed:    dc.w    fader_dflt_spd*256
  706. fadein_speed:    dc.w    fader_dflt_spd*256
  707. blank_time:    dc.w    480
  708. blank_count:    dc.w    480
  709. trk_seq_tbl:    ds.b    100
  710. FF_timer:    dc.l    -1    *$ffff0000+高速タイマ(M:$c0,B:$f8,A:$399)
  711. SL_timer:    dc.l    -1    *$ffff0000+低速タイマ(M:$c0,B:$f8,A:$399)
  712. rel_zp_mark:    ds.l    1
  713. a0work:        ds.l    1
  714. *real_ch_tbl:    ds.l    1
  715. *results:    ds.l    1
  716. *timer_value:    ds.w    1
  717. event_table:    ds.l    3
  718. data_addr_tbl:    dcb.l    max_p+1,0    *address0.l,address1.l,...
  719.  
  720. end:
  721.  
  722. program_start:
  723.     lea    zp_work(pc),a6
  724.     move.l    a0,a0work-zp_work(a6)    *メモリ管理ポインタ
  725.     move.l    a3,env_bak-zp_work(a6)
  726.  
  727.     lea    end_of_prog(pc),a1    *program end address+1
  728.     lea    $10(a0),a0        *メモリブロックの変更
  729.     suba.l    a0,a1
  730.     pea    (a1)
  731.     pea    (a0)
  732.     DOS    _SETBLOCK
  733.     addq.w    #8,sp
  734.     tst.l    d0
  735.     bmi    out_mem
  736.  
  737.     move.l    #(fn_size+3)*max_p+1,-(sp)
  738.     DOS    _MALLOC
  739.     addq.w    #4,sp
  740.     move.l    d0,zpdnm_buf-zp_work(a6)
  741.     bmi    out_mem
  742.  
  743.     move.l    #(fn_size+7)*max_p+1,-(sp)
  744.     DOS    _MALLOC
  745.     addq.w    #4,sp
  746.     move.l    d0,mddnm_buf-zp_work(a6)
  747.     bmi    out_mem
  748.  
  749.     suba.l    a1,a1        *スーパーバイザへ
  750.     IOCS    _B_SUPER
  751.     move.l    d0,ssp-zp_work(a6)
  752.  
  753.     tst.b    $0cbc.w                *MPUが68000ならキャッシュフラッシュ必要無し
  754.     bne    @f
  755.     move.w    #RTS,cache_flush-zp_work(a6)
  756. @@:                        *PCMドライバ
  757.     move.l    #92,-(sp)    *ワーク確保
  758.     DOS    _MALLOC
  759.     addq.w    #4,sp
  760.     move.l    d0,open_fn-zp_work(a6)
  761.     bmi    out_mem
  762.  
  763.     pea    $10000
  764.     DOS    _MALLOC
  765.     addq.w    #4,sp
  766.     move.l    d0,mysp-zp_work(a6)
  767.     bmi    out_mem
  768.     add.l    #$10000,d0
  769.     move.l    d0,sp        *スタックの設定
  770.  
  771.     pea    zmsc3_fader(pc)    *フェーダースピードの取得
  772.     bsr    search_env
  773.     addq.w    #4,sp
  774.     tst.l    d0
  775.     beq    2f
  776.     move.l    a2,-(sp)
  777.     move.l    d0,a2
  778.     bsr    chk_num
  779.     bmi    1f
  780.     bsr    get_num
  781.     tst.l    d1
  782.     bpl    @f
  783.     neg.l    d1
  784. @@:
  785.     cmpi.l    #65535,d1
  786.     bhi    illegal_fader_speed
  787.     move.w    d1,fadeout_speed-zp_work(a6)
  788.     move.w    d1,fadein_speed-zp_work(a6)
  789.     bsr    skip_sep
  790.     bsr    chk_num
  791.     bmi    1f
  792.     bsr    get_num
  793.     tst.l    d1
  794.     bpl    @f
  795.     neg.l    d1
  796. @@:
  797.     cmpi.l    #65535,d1
  798.     bhi    illegal_fader_speed
  799.     move.w    d1,fadein_speed-zp_work(a6)
  800. 1:
  801.     move.l    (sp)+,a2
  802. 2:
  803.     pea    zp3_opt(pc)        *'zp3_opt'
  804.     bsr    search_env
  805.     addq.w    #4,sp
  806.     tst.l    d0
  807.     beq    @f
  808.     move.l    a2,-(sp)
  809.     move.l    d0,a2
  810.     bsr    chk_optsw        *オプションスイッチ
  811.     move.l    (sp)+,a2
  812. @@:
  813.     tst.b    (a2)+        *スイッチ文字列
  814.     beq    print_hlp
  815.  
  816.     bsr    chk_optsw        *オプションスイッチ
  817.     tst.b    (a2)
  818.     bne    m_play_
  819.     bra    print_hlp
  820.  
  821. chk_optsw:            *オプションのチェック
  822. chk_optsw_lp:
  823.     bsr    skip_spc    *スペースのスキップ
  824.     move.b    (a2)+,d0
  825.     beq    @f
  826.     cmpi.b    #'-',d0        *スイッチ指定がある
  827.     beq    go_chk_sw
  828.     cmpi.b    #'/',d0        *スイッチ指定がある。
  829.     beq    go_chk_sw
  830. @@:
  831.     subq.w    #1,a2        *スイッチ無しは演奏開始と解釈
  832.     rts
  833.  
  834. go_chk_sw:
  835.     bsr    skip_spc    *スペースのスキップ
  836.     move.b    (a2)+,d0
  837.     beq    print_hlp
  838.     move.l    d0,d1
  839.     bsr    mk_capital    *小文字/大文字変換
  840.     cmpi.b    #'0',d0
  841.     beq    alt_zmusic_mode
  842.     cmpi.b    #'2',d0
  843.     beq    v2_compatible_mode
  844.     cmpi.b    #'3',d0
  845.     beq    v3_mode
  846.     cmpi.b    #'!',d1        *SE演奏開始
  847.     beq    m_play_fx
  848.     cmpi.b    #'b',d1        *ジュークボックス.
  849.     beq    juke_box    *ループ有り
  850.     cmpi.b    #'e',d1        *enable track.
  851.     beq    enable_tracks
  852.     cmpi.b    #'i',d1        *Z-MUSICと楽器の初期化.
  853.     beq    init_zmsc
  854.     cmpi.b    #'m',d1        *Mute track.
  855.     beq    mask_tracks
  856.     cmpi.b    #'o',d1        *Enable track.
  857.     beq    output_level_tracks
  858.     cmpi.b    #'A',d0        *取り込んだMIDIデータの書き出し.
  859.     beq    midi_input
  860.     cmpi.b    #'B',d0        *ジュークボックス.
  861.     beq    juke_box2    *ループ無し.
  862.     cmpi.b    #'C',d0        *演奏再開.
  863.     beq    m_cont
  864.     cmpi.b    #'D',d0        *受信MIDIインターフェースの指定.
  865.     beq    set_midi_if
  866.     cmpi.b    #'E',d0        *Enable ch.
  867.     beq    enable_ch
  868.     cmpi.b    #'F',d0        *Fadeout.
  869.     beq    fadeout
  870.     cmpi.b    #'G',d0        *非表示モード.
  871.     beq    set_non_disp
  872.     cmpi.b    #'I',d0        *Z-MUSICと楽器の初期化.
  873.     beq    init_zmsc2
  874.     cmpi.b    #'J',d0        *日本語表示.
  875.     beq    japanese_mode
  876.     cmpi.b    #'K',d0        *デバッグツールの常駐.
  877.     beq    zp_key_ctrl
  878.     cmpi.b    #'M',d0        *Mute ch.
  879.     beq    mask_ch
  880.     cmpi.b    #'O',d0        *set ch output level.
  881.     beq    output_level_ch
  882.     cmpi.b    #'P',d0        *演奏開始.
  883.     beq    m_play
  884.     cmpi.b    #'Q',d0        *ステップタイム等の計算.
  885.     beq    m_total
  886.     cmpi.b    #'R',d0        *ジュークボックス終了(解除).
  887.     beq    release
  888.     cmpi.b    #'S',d0        *演奏停止.
  889.     beq    m_stop
  890.     cmpi.b    #'V',d0        *ジュークボックスのインターバル.
  891.     beq    set_juke_interval
  892.     cmpi.b    #'W',d0        *同期演奏.
  893.     beq    synchro_play
  894.     cmpi.b    #'X',d0        *MIDIデータを楽器へ転送.
  895.     beq    midi_send
  896.     cmpi.b    #'Y',d0        *Self Recording
  897.     beq    self_record
  898.     bra    print_hlp
  899.  
  900. set_midi_if:
  901.     bsr    chk_drv        *ドライバ常駐チェック
  902.     bmi    no_drv        *ドライバが組み込まれてない
  903.     bsr    chk_num
  904.     bmi    ask_mdif
  905.     bsr    get_num
  906.     move.l    d1,d2        *in
  907.     move.l    d1,d3        *out
  908.     bsr    skip_sep
  909.     bsr    chk_num
  910.     bmi    @f
  911.     bsr    get_num
  912.     move.l    d1,d3
  913. @@:
  914.     move.l    d2,d1
  915.     subq.l    #1,d1
  916.     bcs    illegal_if
  917.     cmpi.l    #if_max-1,d1
  918.     bgt    illegal_if
  919.     Z_MUSIC    #ZM_CURRENT_MIDI_IN
  920.     tst.l    d0
  921.     bmi    illegal_if
  922.     move.l    d3,d1
  923.     subq.l    #1,d1
  924.     bcs    illegal_if
  925.     cmpi.l    #if_max-1,d1
  926.     bgt    illegal_if
  927.     Z_MUSIC    #ZM_CURRENT_MIDI_OUT
  928.     tst.l    d0
  929.     bmi    illegal_if
  930. print_mdif:
  931.     lea    crntmidiin(pc),a1
  932.     bsr    bil_prta1
  933.     move.l    d2,d0
  934.     bmi    @f
  935.     bsr    num_to_str        *< d0.l=1-3
  936.     lea    suji(pc),a1
  937.     bra    1f
  938. @@:
  939.     lea    none_mdif(pc),a1
  940. 1:
  941.     bsr    prta1
  942.     lea    CRLF(pc),a1
  943.     bsr    prta1
  944.     lea    crntmidiout(pc),a1
  945.     bsr    bil_prta1
  946.     move.l    d3,d0
  947.     bmi    @f
  948.     bsr    num_to_str        *< d0.l=1-3
  949.     lea    suji(pc),a1
  950.     bra    1f
  951. @@:
  952.     lea    none_mdif(pc),a1
  953. 1:
  954.     bsr    prta1
  955.     lea    CRLF(pc),a1
  956.     bsr    prta1
  957.     st.b    no_error_mark-zp_work(a6)
  958.     bra    chk_optsw_lp
  959.  
  960. ask_mdif:
  961.     moveq.l    #-1,d1
  962.     Z_MUSIC    #ZM_CURRENT_MIDI_IN
  963.     move.l    d0,d2
  964.     addq.w    #1,d2
  965.     moveq.l    #-1,d1
  966.     Z_MUSIC    #ZM_CURRENT_MIDI_OUT
  967.     move.l    d0,d3
  968.     addq.w    #1,d3
  969.     bra    print_mdif
  970.  
  971. set_non_disp
  972.     st.b    non_disp-zp_work(a6)
  973.     move.w    #RTS,prta1-zp_work(a6)
  974.     bsr    cache_flush
  975.     bra    chk_optsw_lp
  976.  
  977. cache_flush:                *キャッシュのフラッシュ
  978.     movem.l    d0-d1,-(sp)
  979.     moveq.l    #3,d1
  980.     IOCS    _SYS_STAT
  981.     movem.l    (sp)+,d0-d1
  982.     rts
  983.  
  984. japanese_mode:                *日本語表示
  985.     move.b    #1,lang-zp_work(a6)    *日本語モード
  986.     bra    chk_optsw_lp
  987.  
  988. alt_zmusic_mode:
  989.     bsr    chk_drv        *ドライバ常駐チェック
  990.     bmi    no_drv        *ドライバが組み込まれてない
  991.     moveq.l    #-1,d1
  992.     Z_MUSIC    #ZM_ZMUSIC_MODE
  993.     cmpi.l    #2,d0
  994.     beq    v3_mode
  995.     cmpi.l    #3,d0
  996.     beq    v2_compatible_mode
  997.     bra    illegal_ver_mode
  998.  
  999. v2_compatible_mode:
  1000.     bsr    chk_drv        *ドライバ常駐チェック
  1001.     bmi    no_drv        *ドライバが組み込まれてない
  1002.     moveq.l    #2,d1
  1003.     Z_MUSIC    #ZM_ZMUSIC_MODE
  1004.     tst.l    d0
  1005.     bmi    illegal_ver_mode
  1006. *    st.b    v2_compatch-zp_work(a6)
  1007.     lea    v2_mode_mes(pc),a1
  1008.     bsr    prta1
  1009.     st.b    no_error_mark-zp_work(a6)
  1010.     bra    chk_optsw_lp
  1011.  
  1012. v3_mode:
  1013.     bsr    chk_drv        *ドライバ常駐チェック
  1014.     bmi    no_drv        *ドライバが組み込まれてない
  1015.     moveq.l    #3,d1
  1016.     Z_MUSIC    #ZM_ZMUSIC_MODE
  1017.     tst.l    d0
  1018.     bmi    illegal_ver_mode
  1019.     lea    v3_mode_mes(pc),a1
  1020.     bsr    prta1
  1021.     st.b    no_error_mark-zp_work(a6)
  1022.     bra    chk_optsw_lp
  1023.  
  1024. set_juke_interval:
  1025.     bsr    chk_num
  1026.     bmi    print_hlp
  1027.     bsr    get_num
  1028.     cmp.l    #65535,d1
  1029.     bhi    interval_too_long
  1030.     move.w    d1,blank_count-zp_work(a6)
  1031.     move.w    d1,blank_time-zp_work(a6)
  1032.     bra    chk_optsw_lp
  1033.  
  1034. zp_key_ctrl:            *演奏制御機能の常駐(ZP -K)
  1035.     bsr    kep_chk        *常駐check
  1036.     bpl    jb_already    *既に常駐してます
  1037.     bsr    chk_drv        *ドライバ常駐チェック
  1038.     bmi    no_drv        *ドライバが組み込まれてない
  1039.  
  1040.     bsr    key_bind_db
  1041.  
  1042.     ori.w    #$0700,sr
  1043.  
  1044.     moveq.l    #-1,d1
  1045.     suba.l    a1,a1
  1046.     Z_MUSIC    #ZM_SET_INT_SERVICE
  1047.     tst.l    d0
  1048.     bne    other_prog            *既に他のプログラムが使用中
  1049.  
  1050.     lea    release_zp(pc),a1
  1051.     Z_MUSIC    #ZM_APPLICATION_RELEASER    *解放ルーチンの登録
  1052.     move.l    d0,rel_zp_mark-zp_work(a6)
  1053.     move.l    a0,d0
  1054.     beq    occupied_unsuccessful
  1055.  
  1056.     Z_MUSIC    #ZM_GET_ZMSC_STATUS        *>a0.l=zmusic_stat
  1057.     tas.b    external_applications(a0)    *Debug mode included
  1058.  
  1059.     Z_MUSIC    #ZM_GET_TIMER_MODE    * > d0.l=timer type(0:tm_a  1:tm_b  2:tm_m)
  1060.     move.l    #$ffff0380,FF_timer-zp_work(a6)
  1061.     move.l    #$ffff0000,SL_timer-zp_work(a6)
  1062.     subq.b    #1,d0
  1063.     bne    @f
  1064.     move.l    #$ffff00f7,FF_timer-zp_work(a6)
  1065.     move.l    #$ffff0000,SL_timer-zp_work(a6)
  1066.     bra    dbgmd00
  1067. @@:
  1068.     subq.b    #1,d0
  1069.     bne    dbgmd00
  1070.     move.l    #$ffff0100,FF_timer-zp_work(a6)
  1071.     move.l    #$ffff1fff,SL_timer-zp_work(a6)
  1072. dbgmd00:
  1073.     ori.w    #$0700,sr
  1074.     move.l    #192*65536+77,d1        *mst_clk=192,テンポ=77
  1075.     lea    int_entry_k(pc),a1
  1076.     Z_MUSIC    #ZM_SET_INT_SERVICE
  1077.  
  1078.     lea    debug_mes(pc),a1
  1079.     bsr    bil_prta1
  1080.  
  1081.     bsr    set_verid
  1082.  
  1083.     move.l    ssp(pc),a1    *ユーザーモードへ
  1084.     IOCS    _B_SUPER
  1085.  
  1086.     bsr    free_work
  1087.  
  1088.     clr.w    -(sp)
  1089.     move.l    #end-top,-(sp)
  1090.     DOS    _KEEPPR        *常駐終了
  1091.  
  1092. set_verid:
  1093.     move.l    #'ZP',version_id-zp_work(a6)
  1094.     move.l    #'.R'*65536+v_code*256+v_code_+ver_type,version_id+4-zp_work(a6)
  1095.     rts
  1096.  
  1097. free_work:            *汎用ワークの解放
  1098.     move.l    mysp(pc),-(sp)
  1099.     DOS    _MFREE
  1100.     addq.w    #4,sp
  1101.  
  1102.     move.l    open_fn(pc),-(sp)
  1103.     DOS    _MFREE
  1104.     addq.w    #4,sp
  1105.  
  1106.     move.l    zpdnm_buf(pc),-(sp)
  1107.     DOS    _MFREE
  1108.     addq.w    #4,sp
  1109.  
  1110.     move.l    mddnm_buf(pc),-(sp)
  1111.     DOS    _MFREE
  1112.     addq.w    #4,sp
  1113.  
  1114.     rts
  1115.  
  1116. release:            *演奏制御終了(常駐解除)
  1117.     bsr    kep_chk        *常駐check
  1118.     bmi    not_kep        *常駐していない
  1119.     bsr    chk_drv        *ドライバ常駐チェック
  1120.     bmi    no_drv        *ドライバが組み込まれてない
  1121.  
  1122.     move.l    a2work(pc),d3
  1123.     sub.l    a0work(pc),d3    *calc offset
  1124.  
  1125.     lea    release_zp(pc),a1
  1126.     add.l    d3,a1
  1127.     jsr    (a1)        *>d0.l=error code a1.l=message,x:a6
  1128.  
  1129.     lea    zp_work(pc),a6
  1130.     move.l    d0,d1        *戻り値保存
  1131.     move.l    a1,d0
  1132.     beq    @f
  1133.     bsr    bil_prta1
  1134. @@:
  1135.     tst.l    d1
  1136.     bmi    err_exit    *error
  1137.     move.l    a0,d0
  1138.     beq    exit
  1139.     pea    $10(a0)        *解放
  1140.     DOS    _MFREE
  1141.     addq.w    #4,sp
  1142. exit:                */Wの時パッチが当たる,同期演奏の時パッチが当たる
  1143.     NOP
  1144.     bsr    print_err_code
  1145.  
  1146.     move.l    ssp(pc),a1    *ユーザーモードへ
  1147.     IOCS    _B_SUPER
  1148.  
  1149.     DOS    _EXIT        *終了
  1150.  
  1151. exit2:                *エラーで終了
  1152.     bsr    bil_prta1
  1153. err_exit:
  1154.     tst.b    temp_flg-zp_work(a6)
  1155.     beq    @f
  1156.     pea    temp_name(pc)    *残ってしまった
  1157.     DOS    _DELETE        *テンポラリ削除
  1158.     addq.w    #4,sp
  1159. @@:
  1160.     tst.b    ocpy_int_service-zp_work(a6)
  1161.     beq    @f
  1162.     moveq.l    #0,d1
  1163.     lea    zmint_entry(pc),a1
  1164.     Z_MUSIC    #ZM_SET_INT_SERVICE    *占有していたら解放
  1165. @@:
  1166.     move.l    ssp(pc),a1    *ユーザーモードへ
  1167.     IOCS    _B_SUPER
  1168.  
  1169.     move.w    #-1,-(sp)
  1170.     DOS    _EXIT2
  1171.  
  1172. kep_chk:            *分身が常駐しているか
  1173.     * > eq=exists
  1174.     * > ne=none
  1175.     * > a2work分身のアドレス
  1176.     * - all
  1177. reglist    reg    a0/a2
  1178.     movem.l    reglist,-(sp)
  1179.     bsr    print_title
  1180.     move.l    a0work-zp_work(a6),a0
  1181. @@:                *メモリポインタの先頭を求める
  1182.     move.l    (a0),d0
  1183.     beq    klop1
  1184.     move.l    d0,a0
  1185.     bra    @b
  1186. klop1:
  1187.     move.l    12(a0),d0    *次のメモリ管理ポインタ
  1188.     beq    err_chk
  1189.     movea.l    d0,a2
  1190.     cmpa.l    a0work-zp_work(a6),a2
  1191.     beq    klop_nxt    *自分自身じゃ意味無い
  1192.     lea    version_id-top+$100(a2),a1
  1193.     cmp.l    #'ZP',(a1)+
  1194.     bne    klop_nxt
  1195.     cmp.w    #'.R',(a1)+
  1196.     bne    klop_nxt
  1197.     cmp.w    #v_code*256+v_code_+ver_type,(a1)+
  1198.     bne    wrong_ver
  1199.     move.l    a2,a2work-zp_work(a6)
  1200.     movem.l    (sp)+,reglist
  1201.     moveq.l    #0,d0        *分身の存在を確認
  1202.     rts
  1203. klop_nxt:
  1204.     move.l    a2,a0
  1205.     bra    klop1        *どんどんさかのぼる
  1206. err_chk:            *分身は無かった
  1207.     movem.l    (sp)+,reglist
  1208.     moveq.l    #-1,d0
  1209.     rts
  1210. wrong_ver:            *バージョンが違う
  1211.     movem.l    (sp)+,reglist
  1212.     moveq.l    #1,d0
  1213.     rts
  1214.  
  1215. juke_box2:
  1216.     st.b    one_loop-zp_work(a6)
  1217. juke_box:            *ジュークボックス処理
  1218.     bsr    kep_chk        *常駐check
  1219.     bpl    jb_already    *既に常駐してます
  1220.     bsr    chk_drv        *ドライバ常駐チェック
  1221.     bmi    no_drv        *ドライバが組み込まれてない
  1222.     bsr    read_lzz    *LZZ.Rがあれば読み込んでおく
  1223.     moveq.l    #0,d1        *dummy
  1224.     Z_MUSIC    #ZM_INIT    *m_init
  1225.     move.l    #ID_ZMD,d3
  1226.     Z_MUSIC    #ZM_FREE_MEM2    *全ZMDメモリブロックの解放
  1227.     bsr    skip_spc
  1228.     lea    setup_fn(pc),a0
  1229.     move.l    a0,sfp-setup_fn(a0)
  1230.     moveq.l    #0,d0
  1231.     move.b    d0,setup1(a0)    *ワーク初期化
  1232.     move.b    d0,setup2(a0)
  1233.     move.b    d0,setup3(a0)
  1234.     move.b    d0,setup4(a0)
  1235.     move.l    zpdnm_buf(pc),a0
  1236.     bsr    clr_nm_buf
  1237.     move.l    mddnm_buf(pc),a0
  1238.     bsr    clr_nm_buf
  1239. *    lea    filename(pc),a0
  1240. *    bsr    setsulp
  1241.     lea    JUK_kaku(pc),a1
  1242.     bsr    set_fn
  1243. jkbx_lp:            *セットアップファイルがあるなら最大4つまで指定可能
  1244.     cmpi.b    #',',d0
  1245.     bne    exec_setup_jb
  1246.     bsr    set_stup    *get setup filename
  1247.     add.l    #fn_size,sfp-zp_work(a6)
  1248.     bra    jkbx_lp
  1249. exec_setup_jb:            *セットアップファイルの実行
  1250.     lea    setup_fn(pc),a2
  1251. exec_stjblp:
  1252.     tst.b    (a2)
  1253.     beq    exec_jkbx
  1254.     pea    (a2)
  1255.     pea    (a2)
  1256.     bsr    fopen
  1257.     tst.l    d5
  1258.     bmi    file_not_found
  1259.     bsr    read        *>d3=data size,a5=data address
  1260.     move.l    (sp)+,a2
  1261.     bsr    chk_ext_type    *>a2.l=dest. filename
  1262.     bsr    self_output    *自己出力
  1263.     pea    (a5)
  1264.     DOS    _MFREE
  1265.     addq.w    #4,sp
  1266.     move.l    (sp)+,a2
  1267.     lea    fn_size(a2),a2
  1268.     bra    exec_stjblp
  1269. exec_jkbx:            *juke fileの解釈
  1270.     lea    filename(pc),a2
  1271.     bsr    fopen
  1272.     tst.l    d5
  1273.     bmi    file_not_found
  1274.     bsr    read        *(ret:d3=data size,a5=data address)
  1275. *    move.l    d3,d4
  1276.     move.l    a5,a2
  1277.     move.l    a5,list_adr-zp_work(a6)    *あとでmfreeする時に使用
  1278.  
  1279.     pea    $40000            *とりあえず256kB
  1280.     DOS    _MALLOC
  1281.     addq.w    #4,sp
  1282.     move.l    d0,data_addr_tbl-zp_work(a6)
  1283.     bmi    out_mem            *メモリ不足error
  1284.     move.l    d0,a5            *データアドレス
  1285.     lea    loop_tbl(pc),a1        *曲の繰り返し回数
  1286.     lea    data_addr_tbl(pc),a3    *data table
  1287.     moveq.l    #0,d6            *how many data
  1288.     moveq.l    #0,d7            *total size
  1289.     move.l    d7,last_zpd_addr-zp_work(a6)
  1290. jkbx_lp01:                *演奏データの読み込み
  1291.     move.b    (a2),d0
  1292.     beq    exit_jkbx_lp
  1293.     cmpi.b    #$1a,d0
  1294.     beq    exit_jkbx_lp        *ファイル終端発見
  1295.     cmpi.b    #' ',d0
  1296.     bhi    get_lpc
  1297.     addq.w    #1,a2
  1298.     bra    jkbx_lp01
  1299. get_lpc:                *ループカウンタゲット
  1300.     bsr    chk_num
  1301.     bmi    set_l2
  1302.     bsr    get_num
  1303.     bra    set_l_a1
  1304. set_l2:
  1305.     moveq.l    #1,d1
  1306. set_l_a1:
  1307.     bsr    skip_sep
  1308.     move.b    d1,(a1)+    *ループ回数セット
  1309.     bsr    set_fn2
  1310.     pea    (a2)
  1311.     lea    filename(pc),a2
  1312.     move.l    a5,(a3)+    *set zmd address
  1313.     move.l    a5,hozon_a5-zp_work(a6)
  1314.     clr.l    (a5)+        *end mark
  1315.     clr.l    (a5)+        *dummy
  1316.     movem.l    d3/d7/a5,preserve_d3d7a5-zp_work(a6)    *コンパイルが発生した場合に使用する
  1317.     moveq.l    #0,d0
  1318.     bsr    read_data    *曲データ読み込み > d3.l=size > a5.l=addr
  1319.     cmpi.l    #'ZDF0',(a5)
  1320.     beq    case_ZDF_jk
  1321.     cmpi.l    #ZmuSiC0,(a5)    *IDチェック
  1322.     bne    jkbx_compile
  1323.     move.l    4(a5),d0
  1324.     clr.b    d0
  1325.     cmp.l    #ZmuSiC1,d0
  1326.     bne    unid_error
  1327.     cmpi.b    #$30,7(a5)
  1328.     bcs    version_error    *バージョン不適合
  1329. czj0:                *< d3.l=size < a5.l=addr
  1330.     move.l    a5,zmd_addr-zp_work(a6)
  1331.     addq.l    #1,d3
  1332.     bclr.l    #0,d3
  1333.     add.l    d3,a5
  1334. rd_zpd_lp:
  1335.     pea    (a5)
  1336.     move.l    zmd_addr(pc),a5
  1337.     move.w    #$00ff,zpd_scan-zp_work(a6)    *clr.b    zpd_scan-zp_work(a6)
  1338.                         *st.b    mdd_scan-zp_work(a6)
  1339.     bsr    embed_with_dummy        *get zpd filename(& get mdd filename)
  1340.     move.l    (sp)+,a5
  1341.  
  1342.     tst.b    zpd_scan-zp_work(a6)
  1343.     beq    read_mdd??
  1344. read_zpd:                    *ZPDデータの読み込み
  1345.     lea    filename(pc),a0
  1346.     lea    ZPD_kaku(pc),a2
  1347.     bsr    kakuchoshi
  1348.     lea    filename(pc),a0
  1349.     move.l    zpdnm_buf(pc),a2
  1350.     moveq.l    #3,d5
  1351.     bsr    chk_same_nm        *同じものをすでに読んでいないか(>d0.l=result code)
  1352.     bmi    do_r_zpd        *読んでいない
  1353.     move.l    d0,a0
  1354.     move.b    (a0)+,d1
  1355.     lsl.l    #8,d1
  1356.     move.b    (a0)+,d1
  1357.     lsl.l    #8,d1
  1358.     move.b    (a0)+,d1
  1359.     lsl.l    #8,d1
  1360.     move.b    (a0)+,d1
  1361.     cmp.l    last_zpd_addr(pc),d1
  1362.     beq    rd_zpd_lp        *同じものが2回続く場合は省略
  1363.     move.l    d1,last_zpd_addr-zp_work(a6)
  1364.     move.l    hozon_a5(pc),a0
  1365.     move.l    a5,hozon_a5-zp_work(a6)
  1366.     move.l    a5,(a0)            *set link param.
  1367.     add.l    #16,d7
  1368.     move.l    d7,-(sp)
  1369.     move.l    data_addr_tbl(pc),-(sp)
  1370.     DOS    _SETBLOCK
  1371.     addq.w    #8,sp
  1372.     tst.l    d0
  1373.     bmi    out_mem            *OUT OF MEMORY
  1374.     clr.l    (a5)+            *END MARK
  1375.     clr.l    (a5)+            *ZPD MARK
  1376.     clr.l    (a5)+            *mark address mode
  1377.     move.l    d1,(a5)+        *set data address
  1378.     bra    rd_zpd_lp
  1379.  
  1380. do_r_zpd:
  1381.     move.l    d0,-(sp)
  1382.     move.l    hozon_a5(pc),a0
  1383.     move.l    a5,hozon_a5-zp_work(a6)
  1384.     move.l    a5,(a0)        *set link param.
  1385.     clr.l    (a5)+        *end code
  1386.     clr.l    (a5)+        *zpd mark
  1387.     lea    filename(pc),a2
  1388.     moveq.l    #4,d0
  1389.     bsr    read_data        *ZPDデータ読み込み
  1390.  
  1391.     cmpi.l    #ZPDV2_0,4(a5)        *$10,'ZmA'
  1392.     bne    1f
  1393.     moveq.l    #0,d0            *v2 mark
  1394.     cmpi.l    #ZPDV2_1,4+4(a5)    *'dpCm'
  1395.     beq    @f
  1396.     bra    unid_error
  1397. 1:
  1398.     moveq.l    #2,d0            *PDX mark
  1399.     cmpi.l    #ZPDV3_0,4(a5)        *$1a,'Zma'
  1400.     bne    @f            *PDXとみなす
  1401.     cmpi.l    #ZPDV3_1,4+4(a5)    *'DPcM'
  1402.     bne    unid_error
  1403.     moveq.l    #1,d0            *v3 mark
  1404. @@:
  1405.     move.l    a5,last_zpd_addr-zp_work(a6)
  1406.     move.l    d0,(a5)            *ZPD ID格納
  1407.  
  1408.     move.l    (sp)+,a0    *ファイルネームバッファ/アドレスバッファへ登録
  1409.     move.l    a5,d0
  1410.     bsr    wrt_d02a0
  1411.     addq.l    #1,d3
  1412.     bclr.l    #0,d3
  1413.     add.l    d3,a5
  1414.     bra    rd_zpd_lp
  1415.  
  1416. read_mdd??:                *MDDデータの読み込み
  1417.  
  1418. rd_mdd_lp:
  1419.     pea    (a5)
  1420.     move.l    zmd_addr(pc),a5
  1421.     move.w    #$ff00,zpd_scan-zp_work(a6)    *st.b    zpd_scan-zp_work(a6)
  1422.                         *clr.b    mdd_scan-zp_work(a6)
  1423.     bsr    embed_with_dummy        *get zpd filename(& get mdd filename)
  1424.     move.l    (sp)+,a5
  1425.  
  1426.     tst.b    mdd_scan-zp_work(a6)
  1427.     beq    prepare_next
  1428. read_mdd:
  1429.     lea    mddfilename(pc),a0
  1430.     lea    MID_kaku(pc),a2
  1431.     bsr    kakuchoshi
  1432.     lea    mddfilename(pc),a0
  1433.     move.l    mddnm_buf(pc),a2
  1434.     moveq.l    #7,d5
  1435.     bsr    chk_same_nm        *同じものをすでに読んでいないか(>d0.l=result code)
  1436.     bmi    do_r_mdd        *読んでいない
  1437.     move.l    d0,a0
  1438.     move.b    (a0)+,d1
  1439.     lsl.l    #8,d1
  1440.     move.b    (a0)+,d1
  1441.     lsl.l    #8,d1
  1442.     move.b    (a0)+,d1
  1443.     lsl.l    #8,d1
  1444.     move.b    (a0)+,d1
  1445.     move.l    hozon_a5(pc),a2
  1446.     move.l    a5,hozon_a5-zp_work(a6)
  1447.     move.l    a5,(a2)            *set link param.
  1448.     add.l    #16,d7
  1449.     move.l    d7,-(sp)
  1450.     move.l    data_addr_tbl(pc),-(sp)
  1451.     DOS    _SETBLOCK
  1452.     addq.w    #8,sp
  1453.     tst.l    d0
  1454.     bmi    out_mem            *OUT OF MEMORY
  1455.     clr.l    (a5)+            *end mark
  1456.     move.b    (a0)+,(a5)+        *save size(MDD mark)
  1457.     move.b    (a0)+,(a5)+
  1458.     move.b    (a0)+,(a5)+
  1459.     move.b    (a0)+,(a5)+
  1460.     clr.l    (a5)+            *mark address mode
  1461.     move.l    d1,(a5)+        *set data address
  1462.     bra    rd_mdd_lp
  1463.  
  1464. do_r_mdd:
  1465.     move.l    d0,-(sp)
  1466.     move.l    hozon_a5(pc),a0
  1467.     move.l    a5,hozon_a5-zp_work(a6)
  1468.     move.l    a5,(a0)        *set link param.
  1469.     clr.l    (a5)+        *end code
  1470.     addq.w    #4,a5        *dummy(あとでサイズが入る)
  1471.     lea    mddfilename(pc),a2
  1472.     moveq.l    #4,d0
  1473.     bsr    read_data    *>d3.l=mem.block size,d0.l=mdd true size
  1474.     cmpi.l    #'ZDF0',4(a5)
  1475.     bne    chk_mdd_jk
  1476.     bsr    case_ZDF_jk2    *>d0.l=mdd true size
  1477. chk_mdd_jk:
  1478.     move.l    mdd_dest_if(pc),(a5)
  1479.     move.l    d0,-4(a5)    *save size(MDD mark)
  1480.  
  1481.     move.l    (sp)+,a0
  1482.     move.l    a5,d0
  1483.     bsr    wrt_d02a0    *save address
  1484.     move.l    -4(a5),d0
  1485.     bsr    wrt_d02a0    *save size
  1486.     addq.l    #1,d3
  1487.     bclr.l    #0,d3
  1488.     add.l    d3,a5
  1489.     bra    rd_mdd_lp
  1490. prepare_next:
  1491.     move.b    d6,juke_max-zp_work(a6)
  1492.     addq.b    #1,d6
  1493.     cmpi.b    #max_p,d6
  1494.     bhi    too_many    *曲データ多すぎ
  1495.  
  1496.     move.l    (sp)+,a2
  1497.     bra    jkbx_lp01
  1498.  
  1499. jkbx_compile:                *読み込まれたZMSをコンパイルする
  1500.     lea    filename(pc),a2        *< d3.l=size < a5.l=addr
  1501.     bsr    chk_ext_type        *MDD/MIDだった
  1502.     bmi    not_performance_data    *演奏データではない
  1503.     bsr    compile_zms        *< d3.l=size < a5.l=addr
  1504.     move.l    a5,a2            *a2=addr
  1505.     move.l    d3,d5            *d5=size
  1506.     beq    1f
  1507.                     *起動コンパイラケース
  1508.     bsr    copy_to_jkbxbuf
  1509.     pea    (a2)
  1510.     DOS    _MFREE
  1511.     addq.w    #4,sp
  1512.     bra    czj0
  1513. 1:                    *常駐コンパイラ使用ケース
  1514.     cmpi.l    #ZmuSiC0,(a2)        *$1a,'Zmu'
  1515.     beq    @f
  1516.     move.l    z_zmd_size-8(a2),d5    *d5=zmd size
  1517.     bra    1f
  1518. @@:
  1519.     move.l    z_zmd_size(a2),d5    *d5=zmd size
  1520. 1:
  1521.     bsr    copy_to_jkbxbuf
  1522.     move.l    a1,-(sp)
  1523.     move.l    a2,a1
  1524.     Z_MUSIC    #ZM_FREE_MEM
  1525.     move.l    (sp)+,a1
  1526.     bra    czj0
  1527.  
  1528. copy_to_jkbxbuf:            *コンパイル結果をJUKE BOXバッファへコピー
  1529.     * < a2.l=addr
  1530.     * < d5.l=size
  1531.     * > d3.l=size(入力のd5.lに等しくなる)
  1532.     * > d7.l=total buffer size
  1533.     * - a2
  1534.     movem.l    preserve_d3d7a5(pc),d3/d7/a5
  1535.     move.l    d5,d3
  1536.     add.l    d5,d7
  1537.  
  1538.     addq.l    #1,d7            *.even
  1539.     bclr.l    #0,d7
  1540.  
  1541.     addq.l    #8,d7            *listワークのために8バイト余分に
  1542.     move.l    d7,-(sp)
  1543.     move.l    data_addr_tbl(pc),-(sp)
  1544.     DOS    _SETBLOCK
  1545.     addq.w    #8,sp
  1546.     tst.l    d0
  1547.     bmi    out_mem            *OUT OF MEMORY
  1548.  
  1549.     movem.l    a0/a2,-(sp)
  1550.     move.l    a5,a0
  1551. @@:
  1552.     move.b    (a2)+,(a0)+
  1553.     subq.l    #1,d5
  1554.     bne    @b
  1555.     movem.l    (sp)+,a0/a2
  1556.     rts
  1557.  
  1558. exit_jkbx_lp:
  1559.     move.l    list_adr(pc),-(sp)
  1560.     DOS    _MFREE
  1561.     addq.w    #4,sp
  1562.  
  1563.     ori.w    #$0700,sr
  1564.  
  1565.     bsr    key_bind_jk
  1566.                 *常駐処理
  1567.     moveq.l    #-1,d1
  1568.     suba.l    a1,a1
  1569.     Z_MUSIC    #ZM_SET_INT_SERVICE
  1570.     tst.l    d0
  1571.     bne    other_prog    *すでに他のプログラムが使用中
  1572.  
  1573.     lea    release_zp(pc),a1
  1574.     Z_MUSIC    #ZM_APPLICATION_RELEASER    *解放ルーチンの登録
  1575.     move.l    d0,rel_zp_mark-zp_work(a6)
  1576.     move.l    a0,d0
  1577.     beq    occupied_unsuccessful
  1578.  
  1579.     Z_MUSIC    #ZM_GET_ZMSC_STATUS
  1580.     bset.b    #6,external_applications(a0)    *juke mode included
  1581.  
  1582.     lea    juke_mes(pc),a1
  1583.     bsr    bil_prta1
  1584.  
  1585.     move.l    lzz_adr(pc),d0        *LZZを解放
  1586.     beq    @f
  1587.     move.l    d0,-(sp)
  1588.     DOS    _MFREE
  1589.     addq.w    #4,sp
  1590. @@:
  1591.     lea    event_table(pc),a1
  1592.     lea    set_next_flg_ed(pc),a2
  1593.     move.l    a2,(a1)+        *3:Jump after if performance comes to an end.(0:off)
  1594.     clr.l    (a1)+            *4:Loop time value(0:off/1-256)上位16ビットは0に初期化しておくこと
  1595.     lea    set_next_flg_lp(pc),a2
  1596.     move.l    a2,(a1)+        *5:Jump after n times loop
  1597.  
  1598.     move.l    #192*65536+77,d1        *mst_clk=192,テンポ=77
  1599.     lea    int_entry_j(pc),a1
  1600.     Z_MUSIC    #ZM_SET_INT_SERVICE
  1601.  
  1602.     bsr    set_verid
  1603.  
  1604.     move.l    ssp(pc),a1        *ユーザーモードへ
  1605.     IOCS    _B_SUPER
  1606.  
  1607.     bsr    free_work
  1608.  
  1609.     clr.w    -(sp)
  1610.     move.l    #end-top,-(sp)
  1611.     DOS    _KEEPPR            *常駐終了
  1612.  
  1613. read_data:
  1614.     * < d0.l=付加情報サイズ
  1615.     * < a2.l=filename
  1616.     * < a5.l=address 
  1617.     * < d7.l=total buffer size
  1618.     * > d3.l=size
  1619.     * x d0,d5
  1620.     move.l    d4,-(sp)
  1621.     move.l    d0,d4
  1622.     bsr    fopen
  1623.     tst.l    d5
  1624.     bmi    file_not_found
  1625.     * < d5.l=file handle
  1626.     move.w    #2,-(sp)    *ファィルの長さを調べる
  1627.     clr.l    -(sp)
  1628.     move.w    d5,-(sp)
  1629.     DOS    _SEEK
  1630.      addq.w    #8,sp        *d0.l=file length
  1631.     move.l    d0,d3        *d3=length
  1632.     beq    fsize0        *file size=0
  1633.     add.l    d3,d7
  1634.  
  1635.     addq.l    #1,d7        *.even
  1636.     bclr.l    #0,d7
  1637.  
  1638.     addq.l    #8,d7        *listワークのために8バイト余分に
  1639.     add.l    d4,d7        *付加情報のためにd4バイト余分に
  1640.     move.l    d7,-(sp)
  1641.     move.l    data_addr_tbl(pc),-(sp)
  1642.     DOS    _SETBLOCK
  1643.     addq.w    #8,sp
  1644.     tst.l    d0
  1645.     bmi    out_mem        *OUT OF MEMORY
  1646.  
  1647.     clr.w    -(sp)        *ファイルポインタを元に戻す
  1648.     clr.l    -(sp)
  1649.     move.w    d5,-(sp)
  1650.     DOS    _SEEK
  1651.     addq.w    #8,sp
  1652.  
  1653.     move.l    d3,-(sp)    *push size
  1654.     pea    (a5,d4.l)    *push addr
  1655.     move.w    d5,-(sp)    *file handle
  1656.     DOS    _READ
  1657.     lea    10(sp),sp
  1658.  
  1659.     cmp.l    d0,d3
  1660.     bne    read_err    *読み込み失敗
  1661.  
  1662.     move.l    d0,d4
  1663.     move.w    d5,-(sp)    *close
  1664.     DOS    _CLOSE
  1665.     addq.l    #2,sp
  1666.     move.l    d4,d0
  1667.     move.l    (sp)+,d4
  1668.     rts
  1669.  
  1670. wrt_d02a0:
  1671.     rol.l    #8,d0
  1672.     move.b    d0,(a0)+
  1673.     rol.l    #8,d0
  1674.     move.b    d0,(a0)+
  1675.     rol.l    #8,d0
  1676.     move.b    d0,(a0)+
  1677.     rol.l    #8,d0
  1678.     move.b    d0,(a0)+
  1679.     rts
  1680.  
  1681. clr_nm_buf:
  1682.     movem.l    d0-d1,-(sp)
  1683.     moveq.l    #0,d0
  1684.     move.w    #94*max_p,d1    *94*max_p+1-1だから
  1685. cnb_lp:
  1686.     move.b    d0,(a0)+
  1687.     dbra    d1,cnb_lp
  1688.     movem.l    (sp)+,d0-d1
  1689.     rts
  1690.  
  1691. chk_same_nm:
  1692.     * < a0.l=find source
  1693.     * < a2.l=find destination
  1694.     * < d5.l=number of skip bytes
  1695.     * > d0.l=result
  1696.     * destination format name strings(.b)...,(0,addr(.l))
  1697.     movem.l    d1-d2/a0/a2,-(sp)
  1698. _wc_lp01:
  1699.     bsr    do_get_cmd_num
  1700.     cmpi.l    #-1,d0
  1701.     bne    _exit_wc
  1702. _wc_lp02:
  1703.     tst.b    (a2)+        *次のコマンド名へ
  1704.     bne    _wc_lp02
  1705.     add.l    d5,a2        *skip addr
  1706.     tst.b    (a2)
  1707.     bne    _wc_lp01
  1708. _wc_lp03:            *バッファに登録
  1709.     move.b    (a0)+,d0
  1710.     bsr    mk_capital
  1711.     move.b    d0,(a2)+
  1712.     bne    _wc_lp03
  1713.                 *case error
  1714.     subq.w    #1,a2
  1715.     move.l    a2,d0
  1716.     moveq.l    #-1,d1        *set minus
  1717.     movem.l    (sp)+,d1-d2/a0/a2
  1718.     rts
  1719. _exit_wc:            *case ok
  1720.     moveq.l    #0,d1        *dummy
  1721.     movem.l    (sp)+,d1-d2/a0/a2
  1722.     rts
  1723.  
  1724. do_get_cmd_num:            *実際に文字列を捜す
  1725.     * < a0=source str addr
  1726.     * > d0=-1 can't found
  1727.     move.l    a0,d1
  1728.     move.l    a2,d2
  1729. @@:
  1730.     move.b    (a0)+,d0
  1731.     bsr    mk_capital    *小文字→大文字
  1732.     cmp.b    (a2)+,d0
  1733.     bne    @f
  1734.     tst.b    (a2)        *終了?
  1735.     bne    @b
  1736.     move.l    a2,d0
  1737.     rts
  1738. @@:
  1739.     move.l    d1,a0
  1740.     move.l    d2,a2
  1741.     moveq.l    #-1,d0        *error!
  1742.     rts
  1743.  
  1744. case_ZDF_jk:            *juke box用ZDF展開
  1745.     * < a5.l=ZDF address
  1746.     * > d7.l=calculated total size
  1747.     * - all except result parameters
  1748.     sub.l    d3,d7
  1749.     movem.l    d0-d3/d5/a0-a4,-(sp)
  1750.  
  1751.     move.l    lzz_adr(pc),d0
  1752.     beq    cant_use_lzz
  1753.     move.l    d0,a0
  1754.  
  1755.     lea    bufadr(pc),a4
  1756.  
  1757.     pea    (a4)            *情報テーブル
  1758.     pea    (a5)            *ZDF addr
  1759.     jsr    _ref_data(a0)
  1760.     addq.w    #8,sp
  1761.     tst.l    d0
  1762.     bmi    lzz_err
  1763.  
  1764.     move.w    ZNumOfData(a4),d5
  1765. zjklp0:
  1766.     add.l    ZSize(a4),d7        *展開後のサイズ
  1767.     add.l    #8+1,d7        *list構造のwork size, +1は.even処理用
  1768.     bclr.l    #0,d7        *.even
  1769.     lea    ZNext(a4),a4
  1770.     subq.w    #1,d5
  1771.     bne    zjklp0
  1772.     subq.l    #8,d7        *ZMDの部分はコール以前に考慮済み
  1773.  
  1774.     move.l    a5,a1        *DMA転送のための下準備
  1775.     add.l    d3,a1
  1776. *    subq.w    #1,a1        *source
  1777.     move.l    d3,d2        *size
  1778.     add.l    d3,d7
  1779.     move.l    data_addr_tbl(pc),a2
  1780.     add.l    d7,a2
  1781. *    subq.w    #1,a2        *destination
  1782.  
  1783.     move.l    d7,-(sp)    *あらかじめメモリは確保しておく
  1784.     move.l    data_addr_tbl(pc),-(sp)
  1785.     DOS    _SETBLOCK
  1786.     addq.w    #8,sp
  1787.     tst.l    d0
  1788.     bmi    out_mem        *OUT OF MEMORY
  1789.  
  1790.     bsr    trans_a1_a2_dec
  1791.  
  1792.     lea    bufadr(pc),a4
  1793.  
  1794.     sub.l    d3,a2
  1795.     addq.w    #1,a2        *a2=zdf先頭アドレス
  1796.  
  1797.     pea    (a4)        *情報テーブル
  1798.     pea    (a2)        *ZDF addr
  1799.     jsr    _ref_data(a0)
  1800.     addq.w    #8,sp
  1801.     tst.l    d0
  1802.     bmi    lzz_err
  1803.  
  1804.     move.w    ZNumOfData(a4),d3
  1805. zjklp1:
  1806.     move.l    ZSize(a4),-(sp)        *展開後のサイズ分メモリ確保
  1807.     DOS    _MALLOC
  1808.     addq.w    #4,sp
  1809.     tst.l    d0
  1810.     bmi    out_mem            *OUT OF MEMORY
  1811.     move.l    d0,a1
  1812.  
  1813.     pea    (a1)            *push extract
  1814.     move.l    ZTopAdr(a4),-(sp)
  1815.     jsr    _ext_data(a0)
  1816.     addq.w    #8,sp
  1817.     tst.l    d0
  1818.     bmi    lzz_err
  1819.  
  1820.     move.l    ZSize(a4),d2
  1821.     move.l    a5,a2
  1822.  
  1823.     bsr    trans_a1_a2_inc
  1824.  
  1825.     move.l    d2,d0
  1826.     addq.l    #1,d0
  1827.     bclr.l    #0,d0        *.even
  1828.     add.l    d0,a5
  1829.  
  1830.     move.w    ZKind(a4),d0    *get data type
  1831.     bne    zjk00
  1832.                 *ZMD data
  1833.     cmpi.w    #1,d3        *ZMD1個だけならば
  1834.     beq    zjkfr
  1835.     movem.l    d5/a2/a5,-(sp)
  1836.     move.l    a2,a5
  1837.     move.l    d3,d5
  1838.     move.l    a4,a2
  1839.     bsr    erase_zpd_mdd    *adpcm_block_data,midi_dumpをつぶす
  1840.     movem.l    (sp)+,d5/a2/a5
  1841.     addq.w    #8,a5
  1842.     bra    zjkfr
  1843. zjk00:
  1844.     subq.w    #8,a2
  1845.     cmpi.w    #$20,d0        *ZPD?
  1846.     bne    zjk01
  1847.                 *case:ZPD
  1848.     move.l    hozon_a5(pc),a3
  1849.     move.l    a5,hozon_a5-zp_work(a6)
  1850.     move.l    a2,(a3)        *set link param.
  1851.     clr.l    (a2)+        *end code
  1852.     clr.l    (a2)+        *zpd mark
  1853.     bra    zjkfr
  1854. zjk01:                *case:MDD
  1855.     move.l    hozon_a5(pc),a3
  1856.     move.l    a5,hozon_a5-zp_work(a6)
  1857.     move.l    a2,(a3)        *set link param.
  1858.     clr.l    (a2)+        *end code
  1859.     move.l    d2,(a2)+    *set size
  1860. zjkfr:
  1861.     pea    (a1)
  1862.     DOS    _MFREE
  1863.     addq.w    #4,sp
  1864.  
  1865.     lea    ZNext(a4),a4
  1866.     subq.w    #1,d3
  1867.     bne    zjklp1
  1868.  
  1869.     movem.l    (sp)+,d0-d3/d5/a0-a4
  1870.  
  1871.     sub.l    d3,d7
  1872.     move.l    d7,-(sp)    *あらかじめメモリは確保しておく
  1873.     move.l    data_addr_tbl(pc),-(sp)
  1874.     DOS    _SETBLOCK
  1875.     addq.w    #8,sp
  1876.     tst.l    d0
  1877.     bmi    out_mem        *OUT OF MEMORY
  1878.  
  1879.     cmpi.w    #1,bufadr+ZNumOfData-zp_work(a6)
  1880.     bne    prepare_next
  1881.                     *ZMDが1個だけの時は
  1882.     move.l    hozon_a5(pc),a5
  1883.     addq.w    #8,a5
  1884.     move.l    bufadr+ZSize(pc),d3
  1885.     bra    czj0
  1886.  
  1887. case_ZDF_jk2:            *juke box用ZDF展開(MDD展開専用)
  1888.     * < a5.l=ZDF address
  1889.     * > d7.l=calculated total size
  1890.     * > d0.l=mdd true size
  1891.     * - all except result parameters
  1892.     sub.l    d3,d7
  1893.     movem.l    d0-d3/d5/a0-a2/a4,-(sp)
  1894.  
  1895.     move.l    lzz_adr(pc),d0
  1896.     beq    cant_use_lzz
  1897.     move.l    d0,a0
  1898.  
  1899.     lea    bufadr(pc),a4
  1900.  
  1901.     pea    (a4)            *情報テーブル
  1902.     pea    (a5)            *ZDF addr
  1903.     jsr    _ref_data(a0)
  1904.     addq.w    #8,sp
  1905.     tst.l    d0
  1906.     bmi    lzz_err
  1907.  
  1908.     cmpi.w    #1,ZNumOfData(a4)
  1909.     bne    unid_error_zdf        *MDDデータではあり得ない構造です。
  1910.     cmpi.w    #$41,ZKind(a4)
  1911.     bne    unid_error_zdf        *MDDデータではない。
  1912.  
  1913.     add.l    ZSize(a4),d7        *展開後のサイズ
  1914.     addq.l    #1,d7
  1915.     bclr.l    #0,d7            *.even
  1916.  
  1917.     move.l    a5,a1            *DMA転送のための下準備
  1918.     add.l    d3,a1
  1919. *    subq.w    #1,a1            *source
  1920.     move.l    d3,d2            *size
  1921.     add.l    d3,d7
  1922.     move.l    data_addr_tbl(pc),a2
  1923.     add.l    d7,a2
  1924. *    subq.w    #1,a2            *destination
  1925.  
  1926.     move.l    d7,-(sp)        *あらかじめメモリは確保しておく
  1927.     move.l    data_addr_tbl(pc),-(sp)
  1928.     DOS    _SETBLOCK
  1929.     addq.w    #8,sp
  1930.     tst.l    d0
  1931.     bmi    out_mem            *OUT OF MEMORY
  1932.  
  1933.     bsr    trans_a1_a2_dec
  1934.  
  1935.     lea    bufadr(pc),a4
  1936.  
  1937.     sub.l    d3,a2
  1938.     addq.w    #1,a2            *a2=zdf先頭アドレス
  1939.  
  1940.     pea    (a4)            *情報テーブル
  1941.     pea    (a2)            *ZDF addr
  1942.     jsr    _ref_data(a0)
  1943.     addq.w    #8,sp
  1944.     tst.l    d0
  1945.     bmi    lzz_err
  1946.  
  1947.     move.l    ZSize(a4),-(sp)        *展開後のサイズ分メモリ確保
  1948.     DOS    _MALLOC
  1949.     addq.w    #4,sp
  1950.     tst.l    d0
  1951.     bmi    out_mem            *OUT OF MEMORY
  1952.     move.l    d0,a1
  1953.  
  1954.     pea    (a1)            *push extract
  1955.     move.l    ZTopAdr(a4),-(sp)
  1956.     jsr    _ext_data(a0)
  1957.     addq.w    #8,sp
  1958.     tst.l    d0
  1959.     bmi    lzz_err
  1960.  
  1961.     move.l    ZSize(a4),d2
  1962.     move.l    a5,a2
  1963.  
  1964.     bsr    trans_a1_a2_inc
  1965.  
  1966.     pea    (a1)
  1967.     DOS    _MFREE
  1968.     addq.w    #4,sp
  1969.  
  1970.     movem.l    (sp)+,d0-d3/d5/a0-a2/a4
  1971.  
  1972.     sub.l    d3,d7
  1973.     move.l    d7,-(sp)    *あらかじめメモリは確保しておく
  1974.     move.l    data_addr_tbl(pc),-(sp)
  1975.     DOS    _SETBLOCK
  1976.     addq.w    #8,sp
  1977.     tst.l    d0
  1978.     bmi    out_mem        *OUT OF MEMORY
  1979.  
  1980.     move.l    bufadr+ZSize(pc),d0
  1981.     rts
  1982.  
  1983. read_lzz:
  1984.     movem.l    d0-d1/d5/a2,-(sp)
  1985.     clr.l    lzz_adr-zp_work(a6)
  1986.  
  1987.     bsr    fopen2
  1988.     tst.l    d5
  1989.     bmi    rl00
  1990.     move.w    d5,-(sp)        *close
  1991.     DOS    _CLOSE
  1992.     addq.l    #2,sp
  1993.  
  1994.     pea    $ffff.w
  1995.     DOS    _MALLOC
  1996.     andi.l    #$00ffffff,d0
  1997.     move.l    d0,d1
  1998.     move.l    d0,(sp)
  1999.     DOS    _MALLOC            * lzz 読み込みのためのメモリ確保
  2000.     addq.l    #4,sp
  2001.     tst.l    d0
  2002.     bmi    out_mem
  2003.  
  2004.     movea.l    d0,a2            * a2=LZZの存在アドレス
  2005.     add.l    d0,d1            * リミットアドレス
  2006.     move.l    d1,-(sp)
  2007.     move.l    d0,-(sp)
  2008.     move.l    open_fn(pc),-(sp)
  2009.     move.b    #1,(sp)
  2010.     move.w    #3,-(sp)
  2011.     DOS    _EXEC            * ロード
  2012.     lea    14(sp),sp
  2013.     tst.l    d0
  2014.     bmi    rl00
  2015.  
  2016.     cmpi.l    #'LzzR',_LzzCheck(a2)    * lzzかチェック
  2017.     bne    rl00
  2018.  
  2019.     move.l    _LzzSize(a2),-(sp)
  2020.     pea    (a2)
  2021.     DOS    _SETBLOCK        * メモリブロックを必要な大きさに縮小
  2022.     addq.l    #8,sp
  2023.  
  2024.     move.l    a2,lzz_adr-zp_work(a6)
  2025. rl00:
  2026.     movem.l    (sp)+,d0-d1/d5/a2
  2027.     rts
  2028.  
  2029. trans_a1_a2_dec:
  2030.     movem.l    d2/a1-a2,-(sp)
  2031. @@:
  2032.     move.b    -(a1),-(a2)
  2033.     subq.l    #1,d2
  2034.     bne    @b
  2035.     movem.l    (sp)+,d2/a1-a2
  2036.     rts
  2037.  
  2038. trans_a1_a2_inc:
  2039.     movem.l    d2/a1-a2,-(sp)
  2040. @@:
  2041.     move.b    (a1)+,(a2)+
  2042.     subq.l    #1,d2
  2043.     bne    @b
  2044.     movem.l    (sp)+,d2/a1-a2
  2045.     rts
  2046.  
  2047. synchro_play:
  2048.     move.w    #RTS,exit-zp_work(a6)
  2049.     bsr    cache_flush
  2050.     moveq.l    #-1,d1
  2051.     Z_MUSIC    #ZM_INTERCEPT_PLAY
  2052.     bsr    m_play
  2053.     moveq.l    #-1,d1            *move.l    if_number(pc),d1
  2054.     Z_MUSIC    #ZM_MIDI_REC
  2055. sync_wait:
  2056.     moveq.l    #0,d2
  2057.     moveq.l    #-1,d1            *move.l    if_number(pc),d1
  2058.     Z_MUSIC    #ZM_MIDI_INP1
  2059.  
  2060.     cmpi.b    #$fa,d0        *start message
  2061.     bne    @f
  2062.     moveq.l    #0,d1        *release interception & play
  2063.     bra    bye_sync_play
  2064. @@:
  2065.     bitsns    $0
  2066.     btst.l    #1,d0
  2067.     beq    sync_wait    *取り消し
  2068.     moveq.l    #1,d1        *release interception
  2069. bye_sync_play:
  2070.     Z_MUSIC    #ZM_INTERCEPT_PLAY
  2071.     move.w    #NOP,exit-zp_work(a6)
  2072.     bsr    cache_flush
  2073.     bsr    init_kbuf
  2074.     bra    exit
  2075.  
  2076. m_play_fx:            *効果音サイド演奏開始
  2077.     st.b    normal_play-zp_work(a6)
  2078.     bsr    chk_drv        *ドライバ常駐チェック
  2079.     bmi    no_drv        *ドライバが組み込まれてない
  2080. @@:
  2081.     move.b    (a2)+,d0
  2082.     beq    print_hlp    *ファイル名無しの場合は…
  2083.     cmpi.b    #' ',d0
  2084.     bls    @b
  2085.     subq.w    #1,a2
  2086.     bra    init_mpwk
  2087.  
  2088. m_play_:            *'-P'なしの場合の演奏開始
  2089.     * < a2.l=command line address
  2090.     clr.b    normal_play-zp_work(a6)
  2091.     bsr    chk_drv        *ドライバ常駐チェック
  2092.     bmi    no_drv        *ドライバが組み込まれてない
  2093. @@:
  2094.     move.b    (a2)+,d0
  2095.     beq    just_m_p    *ファイル名無しの場合は…
  2096.     cmpi.b    #' ',d0
  2097.     bls    @b
  2098.     subq.w    #1,a2
  2099.     bra    init_mpwk
  2100.  
  2101. m_play:                *演奏開始
  2102.     * < a2.l=command line address
  2103.     clr.b    normal_play-zp_work(a6)
  2104.     bsr    chk_drv        *ドライバ常駐チェック
  2105.     bmi    no_drv        *ドライバが組み込まれてない
  2106. @@:
  2107.     move.b    (a2)+,d0
  2108.     beq    just_m_p    *ファイル名無しの場合は…
  2109.     cmpi.b    #' ',d0
  2110.     bls    @b
  2111.     subq.w    #1,a2
  2112.  
  2113.     bsr    chk_num        *数字?
  2114.     bpl    trk_play
  2115. init_mpwk:
  2116.     lea    setup_fn(pc),a0
  2117.     move.l    a0,sfp-zp_work(a6)
  2118.     moveq.l    #0,d0
  2119.     move.b    d0,retry-zp_work(a6)
  2120.     move.b    d0,setup1(a0)        *ワーク初期化
  2121.     move.b    d0,setup2(a0)
  2122.     move.b    d0,setup3(a0)
  2123.     move.b    d0,setup4(a0)
  2124.     bsr    get_org_fn
  2125.     lea    ZMD_kaku(pc),a1
  2126.     bsr    set_fn            *>d0.lw=chr,d0.hw=拡張子タイプ
  2127.     lea    filename(pc),a1
  2128.     move.w    d0,-(sp)
  2129.     swap    d0
  2130.     tst.w    d0            *ZMDだったならzmd_nameとして登録
  2131.     bne    @f
  2132.     move.l    a1,zmd_name-zp_work(a6)
  2133.     bra    mply00
  2134. @@:
  2135.     subq.w    #1,d0            *cmpi.w    #1,d0
  2136.     bne    mply00
  2137.     move.l    a1,zms_name-zp_work(a6)
  2138. mply00:
  2139.     move.w    (sp)+,d0
  2140. m_pl_lp:            *セットアップファイルがあるなら最大4つまで指定可能
  2141.     cmpi.b    #',',d0
  2142.     bne    exec_setup
  2143.     bsr    set_stup
  2144.     add.l    #fn_size,sfp-zp_work(a6)
  2145.     bra    m_pl_lp
  2146. exec_setup:            *セットアップファイルの実行
  2147.     lea    setup_fn(pc),a2
  2148. exec_stlp:
  2149.     tst.b    (a2)
  2150.     beq    exec_play
  2151.     pea    (a2)
  2152.     pea    (a2)
  2153.     bsr    fopen
  2154.     tst.l    d5
  2155.     bmi    file_not_found
  2156.     bsr    read        *>d3=data size,a5=data address
  2157.     move.l    (sp)+,a2
  2158.     bsr    chk_ext_type    *>a2.l=dest. filename
  2159.     bsr    self_output    *自己出力
  2160.     move.l    (sp)+,a2
  2161.     lea    fn_size(a2),a2
  2162.     bra    exec_stlp
  2163. exec_play:
  2164.     lea    filename(pc),a2
  2165.     move.l    a2,filename0-zp_work(a6)    *便宜上のソースファイル名として保存
  2166.     bsr    fopen
  2167.     tst.l    d5
  2168.     bpl    do_exc_pl
  2169.     bsr    skip_peri2
  2170. excpl0:                *ZMDでだめならZMS
  2171.     move.b    (a2)+,d0
  2172.     beq    file_not_found2
  2173.     cmpi.b    #'.',d0
  2174.     bne    excpl0
  2175.     moveq.l    #0,d0
  2176.     move.b    retry(pc),d0
  2177.     cmpi.b    #6,d0
  2178.     bhi    file_not_found2
  2179.     add.w    d0,d0
  2180.     move.w    kktbl(pc,d0.w),d0
  2181.     lea    kktbl(pc,d0.w),a5
  2182.     move.b    (a5)+,(a2)+
  2183.     move.b    (a5)+,(a2)+
  2184.     move.b    (a5)+,(a2)+
  2185.     move.b    (a5)+,(a2)+
  2186.     addq.b    #1,retry-zp_work(a6)
  2187.     bra    exec_play
  2188. kktbl:
  2189.     dc.w    ZMD_kaku-kktbl    *0
  2190.     dc.w    ZMS_kaku-kktbl    *1
  2191.     dc.w    OPM_kaku-kktbl    *2
  2192.     dc.w    ZDF_kaku-kktbl    *3
  2193.     dc.w    MID_kaku-kktbl    *4
  2194.     dc.w    MDD_kaku-kktbl    *5
  2195.     dc.w    ZPD_kaku-kktbl    *6
  2196.  
  2197. skip_peri0:
  2198.     cmpi.b    #'.',(a0)+
  2199.     beq    skip_peri0
  2200.     subq.w    #1,a0
  2201.     rts
  2202.  
  2203. skip_peri2:
  2204.     cmpi.b    #'.',(a2)+
  2205.     beq    skip_peri2
  2206.     subq.w    #1,a2
  2207.     rts
  2208.  
  2209. do_exc_pl:                *読み込みと演奏(実行)
  2210.     move.b    retry-zp_work(a6),d0    *リトライ回数を検査
  2211.     beq    @f            *リトライなし
  2212.     subq.b    #1,d0            *cmpi.b    #1,d0
  2213.     bne    @f
  2214.     move.l    a2,zmd_name-zp_work(a6)    *zmdの名前として登録
  2215.     bra    doplyrd
  2216. @@:
  2217.     subq.b    #1,d0
  2218.     bne    doplyrd
  2219.     move.l    a2,zms_name-zp_work(a6)    *zmsの名前として登録
  2220. doplyrd:
  2221.     bsr    read        *>d3:data size,a5=data address
  2222.     cmpi.l    #'ZDF0',(a5)    *ZDF?
  2223.     beq    case_ZDF
  2224.     cmpi.l    #ZmuSiC0,(a5)    *ZMD以外
  2225.     bne    go_on_p
  2226.     cmpi.l    #ZmuSiC1+v_code,4(a5)    *ZMD以外
  2227.     bne    go_on_p
  2228.                 *以下、ZMDの場合
  2229.     bsr    stop_free_zmd
  2230.     bra    do_exc_pl0
  2231.  
  2232. go_on_p:            *演奏開始(ZMS/OPMへの出力)
  2233.     lea    filename(pc),a2
  2234.     bsr    chk_ext_type
  2235.     bpl    @f
  2236.     bsr    self_output    *MID/MDDケース(<d3.l=size, a5=data address, a2=out name)
  2237.     bra    exit
  2238. @@:
  2239.     bsr    stop_free_zmd
  2240.     bsr    compile_zms    *>d3=data size,a5=data address
  2241. do_exc_pl0:
  2242.     move.l    z_title_offset(a5),d0
  2243.     beq    @f        *なし
  2244.     tst.b    non_disp-zp_work(a6)
  2245.     bne    @f
  2246.     move.w    #2,-(sp)    *コメント表示
  2247.     pea    z_title_offset+4(a5,d0.l)
  2248.     DOS    _FPUTS
  2249.     addq.w    #6,sp
  2250. @@:                *ZMD演奏開始
  2251.     tst.b    normal_play-zp_work(a6)
  2252.     bne    @f
  2253.     move.l    d3,d2        *size
  2254.     lea    8(a5),a1    *z_common_offsetから
  2255.     Z_MUSIC    #ZM_PLAY_ZMD
  2256.     bra    exit
  2257. @@:                *効果音演奏
  2258.     move.l    d3,d2
  2259.     bne    @f
  2260.     lea    8(a5),a1    *データ転送なしケース
  2261.     bra    1f
  2262. @@:
  2263.     move.l    #ID_ZMD,d3
  2264.     Z_MUSIC    #ZM_GET_MEM
  2265.     tst.l    d0
  2266.     bmi    out_mem
  2267.     lea    8(a0),a1    *z_common_offsetから
  2268. @@:
  2269.     move.l    (a5)+,(a0)+
  2270.     subq.l    #4,d2
  2271.     bne    @b
  2272. 1:
  2273.     Z_MUSIC    #ZM_PLAY_ZMD_SE
  2274.     bra    exit
  2275.  
  2276. stop_free_zmd:
  2277. reglist    reg    d0/d3/a0/a1
  2278.     tst.b    normal_play-zp_work(a6)
  2279.     bne    @f
  2280.     movem.l    reglist,-(sp)
  2281.     suba.l    a1,a1
  2282.     Z_MUSIC    #ZM_STOP
  2283.  
  2284.     move.l    #ID_ZMD,d3
  2285.     Z_MUSIC    #ZM_FREE_MEM2    *古いZMDを全部解放
  2286.     movem.l    (sp)+,reglist
  2287. @@:
  2288.     rts
  2289.  
  2290. case_ZDF:
  2291.     * < d3=size
  2292.     * < a5.l=data address
  2293.     bsr    read_lzz
  2294.     move.l    lzz_adr(pc),a3
  2295.     lea    bufadr(pc),a2
  2296.     pea    (a2)
  2297.     pea    (a5)
  2298.     jsr    _ref_data(a3)
  2299.     addq.w    #8,sp
  2300.     tst.l    d0
  2301.     bmi    lzz_err
  2302.  
  2303.     moveq.l    #0,d3
  2304.     move.l    d3,a5
  2305.     move.w    ZNumOfData(a2),d5
  2306. lzze_lp:
  2307.     move.l    ZSize(a2),-(sp)
  2308.     DOS    _MALLOC
  2309.     addq.w    #4,sp
  2310.     tst.l    d0
  2311.     bmi    out_mem        *OUT OF MEMORY
  2312.     move.l    d0,a1
  2313.  
  2314.     pea    (a1)        *push extract
  2315.     move.l    ZTopAdr(a2),-(sp)
  2316.     jsr    _ext_data(a3)
  2317.     addq.w    #8,sp
  2318.     tst.l    d0
  2319.     bmi    lzz_err
  2320.  
  2321.     move.w    ZKind(a2),d0    *get data type
  2322.     bne    lzze0        *ZMD以外なら
  2323.     move.l    ZSize(a2),d3    *get zmd size
  2324.     move.l    a1,a5        *get zmd addr.
  2325.     cmpi.w    #1,d5        *ZMDだけならば
  2326.     beq    do_exc_pl0    *メインへ帰還して演奏
  2327.     bsr    erase_zpd_mdd    *adpcm_block_data,midi_dumpをつぶす
  2328.     bra    lzze2
  2329. lzze0:                *ZMDデータ以外のものの実行
  2330.     movem.l    d3/a2/a5,-(sp)
  2331.     move.l    a1,a5
  2332.     move.l    ZSize(a2),d3
  2333.     lea    ZMS(pc),a2
  2334.     cmpi.b    #ZDF_ZMS,d0    *case:ZMS
  2335.     beq    lzze1
  2336.     cmpi.w    #ZDF_PCM,d0    *case:ZPD
  2337.     beq    lzze1
  2338.     cmpi.w    #$41,d0
  2339.     bne    unid_error_zdf        *わけわかんないファイルです。
  2340.     lea    MIDI(pc),a2
  2341. lzze1:
  2342.     bsr    self_output
  2343.     pea    (a1)
  2344.     DOS    _MFREE
  2345.     addq.w    #4,sp
  2346.     movem.l    (sp)+,d3/a2/a5
  2347. lzze2:
  2348.     lea    ZNext(a2),a2
  2349.     subq.w    #1,d5
  2350.     bne    lzze_lp
  2351.     tst.l    d3
  2352.     bne    do_exc_pl0
  2353.     bra    exit
  2354.  
  2355. erase_zpd_mdd:                *ZPD登録/MDD登録コマンドの書きつぶし
  2356.     * < d5.w=num of data
  2357.     * < a5.l=zmd address
  2358.     * < a2.l=bufadr
  2359.     movem.l    d0-d7/a0-a6,-(sp)
  2360.     lea    ZNext(a2),a2
  2361.     subq.w    #1,d5
  2362. ezm_lp:
  2363.     move.w    ZKind(a2),d0
  2364.     cmpi.w    #$20,d0
  2365.     bne    ezm1
  2366.     move.w    #$00_ff,zpd_scan-zp_work(a6)    *clr.b    zpd_scan-zp_work(a6)
  2367.                         *st.b    mdd_scan-zp_work(a6)
  2368.     bra    ezm2
  2369. ezm1:
  2370.     cmpi.w    #$41,d0
  2371.     bne    unid_error_zdf            *わけわかんないファイルです。
  2372.     move.w    #$ff_00,zpd_scan-zp_work(a6)    *st.b    zpd_scan-zp_work(a6)
  2373.                         *clr.b    mdd_scan-zp_work(a6)
  2374. ezm2:
  2375.     bsr    embed_with_dummy    *ダミーでかきつぶす
  2376.     lea    ZNext(a2),a2
  2377.     subq.w    #1,d5
  2378.     bne    ezm_lp
  2379.     movem.l    (sp)+,d0-d7/a0-a6
  2380.     rts
  2381.  
  2382. just_m_p:            *単にm_play()を実行する。
  2383.     Z_MUSIC    #ZM_PLAY2
  2384.     bra    exit
  2385.  
  2386. trk_play:
  2387.     bsr    get_trk_seq    *> a1.l=track_seqtbl
  2388.     Z_MUSIC    #ZM_PLAY
  2389.     bra    exit
  2390.  
  2391. .include    embeddmy.has
  2392.  
  2393. init_zmsc:
  2394.     bsr    chk_drv        *ドライバ常駐チェック
  2395.     bmi    no_drv        *ドライバが組み込まれてない
  2396.     moveq.l    #0,d1        *dummy
  2397.     Z_MUSIC    #ZM_INIT
  2398.     move.l    #ID_ZMD,d3
  2399.     Z_MUSIC    #ZM_FREE_MEM2    *ZMDメモリブロックの解放
  2400.     bra    exit
  2401.  
  2402. init_zmsc2:
  2403.     bsr    chk_drv        *ドライバ常駐チェック
  2404.     bmi    no_drv        *ドライバが組み込まれてない
  2405.     moveq.l    #0,d1        *dummy
  2406.     Z_MUSIC    #ZM_INIT
  2407.     move.l    #ID_ZMD,d3
  2408.     Z_MUSIC    #ZM_FREE_MEM2
  2409.     move.l    #ID_ZPD,d3
  2410.     Z_MUSIC    #ZM_FREE_MEM2
  2411.     move.l    #ID_ZPD_TBL,d3
  2412.     Z_MUSIC    #ZM_FREE_MEM2
  2413.     move.l    #ID_WAVE,d3
  2414.     Z_MUSIC    #ZM_FREE_MEM2
  2415.     move.l    #ID_WAVE_TBL,d3
  2416.     Z_MUSIC    #ZM_FREE_MEM2
  2417.     move.l    #ID_ERROR,d3
  2418.     Z_MUSIC    #ZM_FREE_MEM2
  2419.     move.l    #ID_FMSND,d3
  2420.     Z_MUSIC    #ZM_FREE_MEM2
  2421.     bra    exit
  2422.  
  2423. chk_ext_type:                *拡張子タイプの検査
  2424.     * < a2.l=filename address
  2425.     * > a2.l=出力先デバイス名
  2426.     * minus:mdd,mid or zpd (演奏データではない)
  2427.     * zero:zms or ???
  2428.     * X d0
  2429. reglist    reg    d0/a1
  2430.     movem.l    reglist,-(sp)
  2431.     move.l    a2,filename0-zp_work(a6)    *保存
  2432.     bsr    skip_peri2
  2433. cm_lp0
  2434.     move.b    (a2)+,d0
  2435.     beq    exit_cet
  2436.     cmpi.b    #'.',d0
  2437.     bne    cm_lp0
  2438. chk_mdd:
  2439.     move.l    a2,a1
  2440.     move.b    (a2)+,d0
  2441.     bsr    mk_capital
  2442.     cmpi.b    #'M',d0
  2443.     bne    chk_mid
  2444.     move.b    (a2)+,d0
  2445.     bsr    mk_capital
  2446.     cmpi.b    #'D',d0
  2447.     bne    chk_mid
  2448.     move.b    (a2)+,d0
  2449.     bsr    mk_capital
  2450.     cmpi.b    #'D',d0
  2451.     bne    chk_mid
  2452. yes_mid:
  2453.     lea    MIDI(pc),a2
  2454.     moveq.l    #-1,d0
  2455.     movem.l    (sp)+,reglist
  2456.     rts
  2457. chk_mid:
  2458.     move.l    a1,a2
  2459.     move.b    (a2)+,d0
  2460.     bsr    mk_capital
  2461.     cmpi.b    #'M',d0
  2462.     bne    chk_zpd
  2463.     move.b    (a2)+,d0
  2464.     bsr    mk_capital
  2465.     cmpi.b    #'I',d0
  2466.     bne    chk_zpd
  2467.     move.b    (a2)+,d0
  2468.     bsr    mk_capital
  2469.     cmpi.b    #'D',d0
  2470.     beq    yes_mid
  2471. chk_zpd:
  2472.     move.l    a1,a2
  2473.     move.b    (a2)+,d0
  2474.     bsr    mk_capital
  2475.     cmpi.b    #'Z',d0
  2476.     bne    exit_cet
  2477.     move.b    (a2)+,d0    *ZPD?
  2478.     bsr    mk_capital
  2479.     cmpi.b    #'P',d0
  2480.     bne    exit_cet
  2481.     move.b    (a2)+,d0
  2482.     bsr    mk_capital
  2483.     cmpi.b    #'D',d0
  2484.     bne    exit_cet
  2485.     moveq.l    #-1,d0
  2486.     lea    ZMS(pc),a2
  2487.     movem.l    (sp)+,reglist
  2488.     rts
  2489. exit_cet:
  2490.     moveq.l    #0,d0
  2491.     lea    ZMS(pc),a2
  2492.     movem.l    (sp)+,reglist
  2493.     rts
  2494.  
  2495. m_total:            *合計値計算
  2496.     * < a2.l=command line address
  2497.     bsr    chk_drv        *ドライバ常駐チェック
  2498.     bmi    no_drv        *ドライバが組み込まれてない
  2499.     Z_MUSIC    #ZM_GET_BUFFER_INFORMATION
  2500.     move.l    a0,_common_buffer-zp_work(a6)
  2501. m_ttlp00:
  2502.     move.b    (a2)+,d0
  2503.     beq    do_clc            *ファイル名無しの場合は…
  2504.     cmpi.b    #' ',d0
  2505.     bls    m_ttlp00
  2506.     subq.w    #1,a2
  2507.  
  2508.     bsr    get_org_fn
  2509.     lea    ZMD_kaku(pc),a1
  2510.     bsr    set_fn
  2511.     clr.b    retry-zp_work(a6)
  2512. exc_clc_opn:
  2513.     lea    filename(pc),a2
  2514.     bsr    fopen
  2515.     tst.l    d5
  2516.     bpl    do_ex_clc
  2517.     bsr    skip_peri2
  2518. excclc0:                *ZMDでだめならZMS
  2519.     move.b    (a2)+,d0
  2520.     beq    file_not_found2
  2521.     cmpi.b    #'.',d0
  2522.     bne    excclc0
  2523.     moveq.l    #0,d0
  2524.     move.b    retry(pc),d0
  2525.     cmpi.b    #3,d0
  2526.     bhi    file_not_found2
  2527.     add.w    d0,d0
  2528.     lea    kktbl(pc),a5
  2529.     move.w    (a5,d0.w),d0
  2530.     lea    (a5,d0.w),a5
  2531.     move.b    (a5)+,(a2)+
  2532.     move.b    (a5)+,(a2)+
  2533.     move.b    (a5)+,(a2)+
  2534.     addq.b    #1,retry-zp_work(a6)
  2535.     bra    exc_clc_opn
  2536. do_ex_clc:
  2537.     moveq.l    #0,d1        *dummy
  2538.     Z_MUSIC    #ZM_INIT
  2539.     move.l    #ID_ZMD,d3
  2540.     Z_MUSIC    #ZM_FREE_MEM2    *ZMDメモリブロックの解放
  2541.     bsr    read        *>d3:data size,a5=data address
  2542.     move.l    d3,d2        *d2.l=size
  2543.     cmpi.l    #'ZDF0',(a5)    *ZDF?
  2544.     beq    case_ZDF_clc
  2545.     cmpi.l    #ZmuSiC0,(a5)    *MDD OR ZMS
  2546.     bne    go_on_clc
  2547.     move.l    4(a5),d0
  2548.     clr.b    d0
  2549.     cmp.l    #ZmuSiC1,d0
  2550.     bne    unid_error
  2551.     cmpi.b    #$30,7(a5)
  2552.     bcs    version_error    *バージョン不適合
  2553.     bra    go_on_clc_zmd
  2554.  
  2555. go_on_clc:                *ZMSの演奏開始
  2556.     lea    filename(pc),a2
  2557.     bsr    chk_ext_type
  2558.     bmi    not_performance_data    *演奏データではない
  2559.     bsr    compile_zms        *> a5.l=zmd addr, d3=size
  2560. go_on_clc_zmd:                *ZMD演奏開始
  2561.     lea    8(a5),a1        *< a1.l=data address
  2562.     move.l    d3,d2
  2563.     Z_MUSIC    #ZM_PLAY_ZMD        *< d2.l=size
  2564.     tst.l    d0
  2565.     bne    exit
  2566. do_clc:
  2567.     moveq.l    #ZM_COMPILER,d1
  2568.     lea    -1.w,a1            *detect mode
  2569.     Z_MUSIC    #ZM_HOOK_FNC_SERVICE
  2570.     move.l    _common_buffer(pc),a1
  2571.     move.l    trk_buffer_top(a1),d0
  2572.     beq    exit
  2573.     move.l    d0,a1            *a1.l=現在演奏中のZMD ADDRESS
  2574.     cmpi.l    #ZmuSiC0,(a1)        *$1a,'Zmu'
  2575.     beq    @f
  2576.     move.l    z_zmd_size-8(a1),d2    *d2=zmd size
  2577.     bra    1f
  2578. @@:
  2579.     move.l    z_zmd_size(a1),d2    *d2=zmd size
  2580. 1:
  2581.     move.l    a0,d0
  2582.     bne    @f
  2583.     bsr    call_calc_total        *コンパイラ起動して計算させる
  2584.     bra    exit
  2585. @@:                    *常駐コンパイラを用いて計算させる
  2586.     Z_MUSIC    #ZM_CALC_TOTAL
  2587.     tst.l    d0
  2588.     bne    err_in_calc        *なんらかのエラーが発生したので計算は行なわれなかった
  2589.     bsr    disprslt        *結果のディスプレイ < d2.l=zmd size
  2590.     bra    exit
  2591.  
  2592. case_ZDF_clc:
  2593.     * < d3=size
  2594.     * < a5.l=data address
  2595.     bsr    read_lzz
  2596.     move.l    lzz_adr(pc),a3
  2597.     lea    bufadr(pc),a2
  2598.     pea    (a2)
  2599.     pea    (a5)
  2600.     jsr    _ref_data(a3)
  2601.     addq.w    #8,sp
  2602.     tst.l    d0
  2603.     bmi    lzz_err
  2604.  
  2605.     move.l    ZSize(a2),-(sp)
  2606.     DOS    _MALLOC
  2607.     addq.w    #4,sp
  2608.     tst.l    d0
  2609.     bmi    out_mem        *OUT OF MEMORY
  2610.     move.l    d0,a1
  2611.  
  2612.     pea    (a1)        *push extract
  2613.     move.l    ZTopAdr(a2),-(sp)
  2614.     jsr    _ext_data(a3)
  2615.     addq.w    #8,sp
  2616.     tst.l    d0
  2617.     bmi    lzz_err
  2618.  
  2619.     move.l    ZSize(a2),d3    *get zmd size
  2620.     move.l    a1,a5        *get zmd addr.
  2621.     move.w    ZKind(a2),d0    *get data type
  2622.     beq    go_on_clc_zmd    *メインへ帰還
  2623.     cmpi.w    #ZDF_ZMS,d0        *ZMS?
  2624.     beq    go_on_clc        *yes
  2625.     bra    not_performance_data    *no:演奏データではない
  2626.  
  2627.     .include    disprslt.has
  2628.  
  2629. free_mem:
  2630.     Z_MUSIC    #ZM_FREE_MEM
  2631.     rts
  2632.  
  2633. prta1_:
  2634.     pea    (a1)
  2635.     DOS    _PRINT
  2636.     addq.w    #4,sp
  2637.     rts
  2638.  
  2639. mask_tracks:            *トラック・マスク
  2640.     * < a2.l=command line address
  2641.     bsr    chk_drv        *ドライバ常駐チェック
  2642.     bmi    no_drv        *ドライバが組み込まれてない
  2643. msk_lp00:
  2644.     move.b    (a2)+,d0
  2645.     beq    reset_tr_mask
  2646.     cmpi.b    #' ',d0
  2647.     bls    msk_lp00
  2648.     subq.w    #1,a2
  2649.  
  2650.     bsr    chk_num        *数字?
  2651.     bmi    reset_tr_mask
  2652.     moveq.l    #-1,d3
  2653.     bsr    get_mask_trk
  2654.     Z_MUSIC    #ZM_MASK_TRACKS
  2655.     bra    exit
  2656.  
  2657. reset_tr_mask:            *mask取り消し
  2658.     moveq.l    #0,d1
  2659.     move.l    d1,a1
  2660.     Z_MUSIC    #ZM_MASK_TRACKS
  2661.     bra    exit
  2662.  
  2663. enable_tracks:            *トラック・マスク解除
  2664.     * < a2.l=command line address
  2665.     bsr    chk_drv        *ドライバ常駐チェック
  2666.     bmi    no_drv        *ドライバが組み込まれてない
  2667. slp_lp00:
  2668.     move.b    (a2)+,d0
  2669.     beq    reset_tr_mask
  2670.     cmpi.b    #' ',d0
  2671.     bls    slp_lp00
  2672.     subq.w    #1,a2
  2673.  
  2674.     bsr    chk_num        *数字?
  2675.     bmi    reset_tr_mask
  2676.     moveq.l    #0,d3        *enable
  2677.     bsr    get_mask_trk
  2678.     Z_MUSIC    #ZM_MASK_TRACKS
  2679.     bra    exit
  2680.  
  2681. get_mask_trk:            *トラック番号を取得してテーブルへ
  2682.     * < d3.w=mode
  2683.     * > a1.l=track_seqtbl
  2684.     * - all
  2685. reglist    reg    d1-d2/a0
  2686.     movem.l    reglist,-(sp)
  2687.     lea    track_seqtbl(pc),a0
  2688.     move.l    a0,a1
  2689.     moveq.l    #0,d2
  2690. gmt_lp:
  2691.     bsr    chk_num
  2692.     bmi    @f        *error case
  2693.     bsr    get_num
  2694.     subq.w    #1,d1
  2695.     cmpi.w    #tr_max-1,d1
  2696.     bhi    illegal_p
  2697.     move.w    d1,(a0)+    *track
  2698.     move.w    d3,(a0)+    *mode
  2699.     addq.w    #1,d2
  2700.     cmpi.w    #128,d2
  2701.     bhi    too_many_trks
  2702.     bsr    skip_sep
  2703.     bra    gmt_lp
  2704. @@:
  2705.     move.w    #-1,(a0)+
  2706.     movem.l    (sp)+,reglist
  2707.     rts
  2708.  
  2709. mask_ch:            *チャンネル・マスク
  2710.     * < a2.l=command line address
  2711.     bsr    chk_drv        *ドライバ常駐チェック
  2712.     bmi    no_drv        *ドライバが組み込まれてない
  2713. msk_lp01:
  2714.     move.b    (a2)+,d0
  2715.     beq    reset_ch_mask
  2716.     cmpi.b    #' ',d0
  2717.     bls    msk_lp01
  2718.     subq.w    #1,a2
  2719.  
  2720.     moveq.l    #-1,d3
  2721.     bsr    get_mask_ch
  2722.     Z_MUSIC    #ZM_MASK_CHANNELS
  2723.     bra    exit
  2724.  
  2725. reset_ch_mask:            *mask取り消し
  2726.     moveq.l    #0,d1
  2727.     move.l    d1,a1
  2728.     Z_MUSIC    #ZM_MASK_CHANNELS
  2729.     bra    exit
  2730.  
  2731. enable_ch:            *チャンネル・マスク解除
  2732.     * < a2.l=command line address
  2733.     bsr    chk_drv        *ドライバ常駐チェック
  2734.     bmi    no_drv        *ドライバが組み込まれてない
  2735. slp_lp01:
  2736.     move.b    (a2)+,d0
  2737.     beq    reset_ch_mask
  2738.     cmpi.b    #' ',d0
  2739.     bls    slp_lp01
  2740.     subq.w    #1,a2
  2741.  
  2742.     moveq.l    #0,d3        *enable
  2743.     bsr    get_mask_ch
  2744.     Z_MUSIC    #ZM_MASK_CHANNELS
  2745.     bra    exit
  2746.  
  2747. get_mask_ch:            *トラック番号を取得してテーブルへ
  2748.     * < d3.w=mode
  2749.     * > a1.l=track_seqtbl
  2750.     * - all
  2751. reglist    reg    d1-d2/a0
  2752.     movem.l    reglist,-(sp)
  2753.     lea    track_seqtbl(pc),a0
  2754.     move.l    a0,a1
  2755.     moveq.l    #0,d1
  2756. gmc_lp:
  2757.     bsr    skip_spc
  2758.     tst.b    (a2)
  2759.     beq    exit_gmc
  2760.     bsr    get_str_ch    *>d2.l=device code
  2761.     move.l    d2,(a0)+    *track
  2762.     move.w    d3,(a0)+    *mode
  2763.     addq.w    #1,d1
  2764.     cmpi.w    #128,d1
  2765.     bhi    too_many_trks
  2766.     bsr    skip_sep
  2767.     bra    gmc_lp
  2768. exit_gmc:
  2769.     move.l    #-1,(a0)+
  2770.     movem.l    (sp)+,reglist
  2771.     rts
  2772.  
  2773. output_level_tracks:        *出力設定
  2774.     * < a2.l=command line address
  2775.     bsr    chk_drv        *ドライバ常駐チェック
  2776.     bmi    no_drv        *ドライバが組み込まれてない
  2777. sopl_lp00:
  2778.     move.b    (a2)+,d0
  2779.     beq    reset_sopl
  2780.     cmpi.b    #' ',d0
  2781.     bls    sopl_lp00
  2782.     subq.w    #1,a2
  2783.  
  2784.     bsr    chk_num        *数字?
  2785.     bmi    reset_sopl
  2786.  
  2787.     bsr    get_num        *get level
  2788.     bsr    skip_sep
  2789.     bsr    chk_num
  2790.     bpl    @f
  2791.     lea    track_seqtbl(pc),a0    *全トラック設定ケース
  2792.     move.l    a0,a1
  2793.     move.l    #$ffff_03_00,(a0)+    *-1:all,03=omt,00=dummy speed
  2794.     clr.b    (a0)+            *00=dummy speed
  2795.     move.b    d1,(a0)+
  2796.     move.b    d1,(a0)+
  2797.     Z_MUSIC    #ZM_SET_TR_OUTPUT_LEVEL
  2798.     bra    exit
  2799. @@:                    *設定ケース
  2800.     move.l    d1,d3
  2801.     bsr    get_otptlv_trk        *>a1.l=trk seq.
  2802.     bmi    exit
  2803.     Z_MUSIC    #ZM_SET_TR_OUTPUT_LEVEL
  2804.     bra    @b
  2805.  
  2806. reset_sopl:
  2807.     lea    track_seqtbl(pc),a0
  2808.     move.l    a0,a1
  2809.     move.l    #$ffff_03_00,(a0)+    *-1:all,03=omt,00=dummy
  2810.     move.l    #$80<<16+$80<<8,(a0)+
  2811.     Z_MUSIC    #ZM_SET_TR_OUTPUT_LEVEL
  2812.     bra    exit
  2813.  
  2814. get_otptlv_trk:            *トラック番号を取得してテーブルへ
  2815.     * < d3.w=level
  2816.     * > a1.l=track_seqtbl
  2817.     * > minus:error
  2818.     * - all
  2819. reglist    reg    d1/a0
  2820.     movem.l    reglist,-(sp)
  2821.     lea    track_seqtbl(pc),a0
  2822.     move.l    a0,a1
  2823.     bsr    chk_num
  2824.     bmi    @f        *error case
  2825.     bsr    get_num
  2826.     subq.w    #1,d1
  2827.     cmpi.w    #tr_max-1,d1
  2828.     bhi    illegal_p
  2829.     move.w    d1,(a0)+    *track
  2830.     bsr    skip_sep
  2831.     move.b    #3,(a0)+    *omt
  2832.     clr.b    (a0)+        *speed
  2833.     clr.b    (a0)+
  2834.     move.b    d3,(a0)+    *start
  2835.     move.b    d3,(a0)+    *end
  2836.     moveq.l    #0,d1        *zero flag on
  2837. @@:
  2838.     movem.l    (sp)+,reglist
  2839.     rts
  2840.  
  2841. output_level_ch:        *チャンネル出力設定
  2842.     * < a2.l=command line address
  2843.     bsr    chk_drv        *ドライバ常駐チェック
  2844.     bmi    no_drv        *ドライバが組み込まれてない
  2845. csopl_lp00:
  2846.     move.b    (a2)+,d0
  2847.     beq    reset_csopl
  2848.     cmpi.b    #' ',d0
  2849.     bls    csopl_lp00
  2850.     subq.w    #1,a2
  2851.  
  2852.     bsr    chk_num        *数字?
  2853.     bmi    reset_csopl
  2854.  
  2855.     bsr    get_num        *get level
  2856.     bsr    skip_sep
  2857.     tst.b    (a2)
  2858.     bne    @f
  2859.     lea    track_seqtbl(pc),a0    *全チャンネル設定ケース
  2860.     move.l    a0,a1
  2861.     move.l    #$ffff_ffff,(a0)+    *-1:all device,-1:all ch
  2862.     move.w    #$03_00,(a0)+        *omt,spd_h=0
  2863.     move.w    d1,(a0)+        *spd_l=0,start
  2864.     move.b    d1,(a0)+        *end
  2865.     Z_MUSIC    #ZM_SET_CH_OUTPUT_LEVEL
  2866.     bra    exit
  2867. @@:                    *設定ケース
  2868.     move.l    d1,d3
  2869.     bsr    get_otptlv_ch        *>a1.l=trk seq.
  2870.     bmi    exit
  2871.     Z_MUSIC    #ZM_SET_CH_OUTPUT_LEVEL
  2872.     bra    @b
  2873.  
  2874. reset_csopl:
  2875.     lea    track_seqtbl(pc),a0
  2876.     move.l    a0,a1
  2877.     move.l    #$ffff_ffff,(a0)+    *-1:all,03=omt,00=dummy
  2878.     move.l    #$03_0000_80,(a0)+
  2879.     move.b    #$80,(a0)+
  2880.     Z_MUSIC    #ZM_SET_CH_OUTPUT_LEVEL
  2881.     bra    exit
  2882.  
  2883. get_otptlv_ch:            *チャンネル番号を取得してテーブルへ
  2884.     * < d3.w=level
  2885.     * > a1.l=track_seqtbl
  2886.     * > minus:error
  2887.     * - all
  2888. reglist    reg    d1-d2/a0
  2889.     movem.l    reglist,-(sp)
  2890.     lea    track_seqtbl(pc),a0
  2891.     move.l    a0,a1
  2892.     tst.b    (a2)
  2893.     beq    err_exit_goc
  2894.     bsr    get_str_ch    *>d2.l=device code
  2895.     move.l    d2,(a0)+    *device
  2896.     move.b    #3,(a0)+    *omt
  2897.     clr.b    (a0)+        *speed
  2898.     clr.b    (a0)+
  2899.     move.b    d3,(a0)+    *start
  2900.     move.b    d3,(a0)+    *end
  2901.     bsr    skip_sep
  2902.     moveq.l    #0,d1        *zero flag on
  2903.     movem.l    (sp)+,reglist
  2904.     rts
  2905. err_exit_goc:
  2906.     moveq.l    #-1,d1        *minus flag on
  2907.     movem.l    (sp)+,reglist
  2908.     rts
  2909.  
  2910. get_str_ch:                *文字でチャンネルアサイン
  2911.     * < (a2)=str addr.
  2912.     * > (a2)=next
  2913.     * > d2.l=typ,ch value
  2914.     * - all
  2915.     movem.l    d0-d1,-(sp)
  2916.     moveq.l    #0,d1
  2917.     bsr    skip_spc
  2918.     move.b    (a2)+,d0
  2919.     beq    illegal_ch
  2920.     andi.b    #$df,d0
  2921.     cmpi.b    #'F',d0
  2922.     beq    gsc_case_fm
  2923.     cmpi.b    #'A',d0
  2924.     beq    gsc_case_ad
  2925.     cmpi.b    #'P',d0
  2926.     bne    gsc_case_md
  2927. gsc_case_ad:            *ADPCM
  2928.     bsr    srch_num
  2929.     bmi    @f
  2930.     bsr    get_num
  2931.     subq.l    #1,d1
  2932.     bcs    illegal_ch
  2933.     cmpi.l    #15,d1
  2934.     bhi    illegal_ch
  2935.     bra    gsc00
  2936. @@:                *チャンネル番号省略ケース
  2937.     move.b    adpcm_default_ch-zp_work(a6),d1
  2938.     addq.b    #1,adpcm_default_ch-zp_work(a6)
  2939. gsc00:
  2940.     moveq.l    #1,d2
  2941.     swap    d2
  2942.     move.w    d1,d2
  2943.     movem.l    (sp)+,d0-d1
  2944.     rts
  2945. gsc_case_fm:            *FM
  2946.     bsr    srch_num
  2947.     bmi    illegal_ch
  2948.     bsr    get_num
  2949.     subq.l    #1,d1
  2950.     bcs    illegal_ch
  2951.     cmpi.l    #7,d1
  2952.     bhi    illegal_ch
  2953.     move.l    d1,d2
  2954.     movem.l    (sp)+,d0-d1
  2955.     rts
  2956. gsc_case_md:
  2957.     move.l    #-1,d2        *default type(-1 means current)
  2958.     cmpi.b    #'M',d0
  2959.     bne    illegal_if
  2960.     bsr    srch_num
  2961.     bmi    illegal_ch
  2962.     bsr    get_num
  2963.     bsr    skip_spc
  2964.     move.b    (a2),d0        *前のパラメータがインターフェース番号で
  2965.     beq    illegal_ch
  2966.     cmpi.b    #':',d0        *今度の数値がチャンネル番号?
  2967.     beq    @f
  2968.     cmpi.b    #'-',d0
  2969.     bne    mdch_chk_gsc
  2970. @@:                *get ch num
  2971.     addq.w    #1,a2
  2972.     bsr    chk_num
  2973.     bmi    illegal_ch
  2974.     move.l    d1,d2        *save I/F to d2
  2975.     bsr    get_num        *get ch no.(有効範囲は後でチェック
  2976.     subq.l    #1,d2
  2977.     bcs    illegal_if
  2978.     cmpi.l    #if_max-1,d2
  2979.     bhi    illegal_if
  2980.     ori.w    #$8000,d2
  2981.     swap    d2
  2982. mdch_chk_gsc:
  2983.     subq.l    #1,d1
  2984.     bcs    illegal_ch
  2985.     cmpi.l    #15,d1
  2986.     bhi    illegal_ch
  2987.     move.w    d1,d2
  2988.     movem.l    (sp)+,d0-d1
  2989.     rts
  2990.  
  2991. srch_num:            *数字までスキップ
  2992.     * X d0
  2993.     move.w    d0,-(sp)
  2994. srch_num_lp:
  2995.     move.b    (a2)+,d0
  2996.     beq    @f        *コマンドの途中でファイルの最後に来た
  2997.     cmpi.b    #'{',d0
  2998.     beq    sn_err        *コマンドの途中で改行
  2999.     cmpi.b    #'}',d0
  3000.     beq    sn_err
  3001.     cmpi.b    #'(',d0
  3002.     beq    sn_err
  3003.     cmpi.b    #')',d0
  3004.     beq    sn_err
  3005. snchk_cmma:
  3006.     cmpi.b    #',',d0
  3007.     beq    sn_err
  3008.     cmpi.b    #'$',d0
  3009.     beq    its_num
  3010.     cmpi.b    #'%',d0
  3011.     beq    its_num
  3012.     cmpi.b    #'0',d0
  3013.     bcs    srch_num_lp
  3014.     cmpi.b    #'9',d0
  3015.     bhi    srch_num_lp
  3016. its_num:
  3017.     subq.w    #1,a2
  3018.     move.w    (sp)+,d0
  3019.     move.w    #CCR_ZERO,ccr
  3020.     rts
  3021. sn_err:
  3022.     subq.w    #1,a2
  3023. @@:
  3024.     move.w    (sp)+,d0
  3025.     move.w    #CCR_NEGA,ccr
  3026.     rts
  3027.  
  3028. kakuchoshi:            *拡張子を設定
  3029.     * < a0=filename address
  3030.     * < a2=拡張子アドレス
  3031.     * X a0
  3032.     bsr    skip_peri0
  3033.     moveq.l    #fn_size-1,d0
  3034. kkchs_lp:
  3035.     move.b    (a0)+,d0
  3036.     beq    do_kkchs
  3037.     cmpi.b    #'.',d0
  3038.     beq    find_period
  3039.     dbra    d0,kkchs_lp
  3040. do_kkchs:
  3041.     subq.l    #1,a0
  3042.     move.b    #'.',(a0)+
  3043.     move.b    (a2)+,(a0)+
  3044.     move.b    (a2)+,(a0)+
  3045.     move.b    (a2)+,(a0)+
  3046.     clr.b    (a0)
  3047.     rts
  3048. find_period:
  3049.     cmpi.b    #' ',(a0)
  3050.     bls    do_kkchs    *'.'はあっても拡張子がないケース
  3051.     rts
  3052.  
  3053. get_org_fn:
  3054.     movem.l    a0/a2,-(sp)
  3055.     lea    org_fn(pc),a0
  3056. gef0:
  3057.     move.b    (a2)+,(a0)+
  3058.     bne    gef0
  3059.     movem.l    (sp)+,a0/a2
  3060.     rts
  3061.  
  3062. set_fn:                *ファイルネームのセット
  3063.     * < a1.l=拡張子source    *拡張子の種別をかえす
  3064.     * < a2.l=source filename
  3065.     * > d0.lw=last chr
  3066.     * > d0.hw=拡張子タイプ(0-6,-1)
  3067.     movem.l    d1/a0/a1-a3,-(sp)
  3068.     lea    filename(pc),a0
  3069. @@:
  3070.     cmpi.b    #'.',(a2)
  3071.     bne    @f
  3072.     move.b    (a2)+,(a0)+
  3073.     bra    @b
  3074. @@:
  3075.     clr.b    d1
  3076. setfnlp:
  3077.     move.b    (a2)+,d0
  3078.     cmpi.b    #'.',d0
  3079.     bne    chk_sp_
  3080.     st.b    d1
  3081.     lea    1(a0),a3    *拡張子の3文字が存在するアドレス
  3082. chk_sp_:
  3083.     cmpi.b    #' ',d0
  3084.     bls    exit_setfn
  3085.     cmpi.b    #',',d0
  3086.     beq    exit_setfn
  3087.     move.b    d0,(a0)+
  3088.     bra    setfnlp
  3089. exit_setfn:
  3090.     tst.b    d1        *拡張子省略かどうか
  3091.     bne    set_edc_    *省略しなかった
  3092.     move.b    #'.',(a0)+    *拡張子をセット
  3093.     move.l    a0,a3
  3094.     move.b    (a1)+,(a0)+
  3095.     move.b    (a1)+,(a0)+
  3096.     move.b    (a1)+,(a0)+
  3097. set_edc_:
  3098.     clr.b    (a0)
  3099.     lea    ext_tbl(pc),a1
  3100.     move.l    a3,a2
  3101.     move.w    d0,-(sp)
  3102.     bsr    get_com_no2
  3103.     swap    d0
  3104.     move.w    (sp)+,d0    *d0.hw=ext type,d0.lw=last chr
  3105.     movem.l    (sp)+,d1/a0/a1-a3
  3106.     rts
  3107.  
  3108. reglist    reg    d1-d2
  3109. get_com_no2:            *コマンド文字列->数値変換
  3110.     * < a1=com_tbl
  3111.     * < a2=source
  3112.     * > d0=#cmd number
  3113.     * minus error
  3114.     * X a1,a3
  3115.     movem.l    reglist,-(sp)
  3116.     bsr    skip_spc    
  3117.     moveq.l    #0,d2
  3118. wc_lp01:
  3119.     tst.b    (a1)
  3120.     bmi    exit_err_wc
  3121.     bsr    do_get_cmd_num2
  3122.     beq    exit_wc
  3123. @@:
  3124.     tst.b    (a1)+        *次のコマンド名へ
  3125.     bne    @b
  3126.     addq.b    #1,d2        *cmd number
  3127.     bra    wc_lp01
  3128. exit_err_wc:
  3129.     moveq.l    #-1,d0        *couldn't find it...
  3130.     movem.l    (sp)+,reglist
  3131.     rts
  3132. exit_wc:
  3133.     move.l    d2,d0        *d0=cmd number
  3134.     movem.l    (sp)+,reglist
  3135.     rts
  3136.  
  3137. do_get_cmd_num2:        *実際に文字列を捜す
  3138.     * < a1=source str addr
  3139.     * > eq=get it!
  3140.     * > mi=can't found
  3141.     move.l    a1,-(sp)
  3142.     move.l    a2,d1        *save a2 to d1
  3143. @@:
  3144.     move.b    (a2)+,d0
  3145.     beq    not_same_dgscn2    *途中で終わった
  3146.     jsr    mk_capital-zp_work(a6)    *小文字→大文字
  3147.     cmp.b    (a1)+,d0
  3148.     bne    not_same_dgscn2
  3149.     tst.b    (a1)        *終了
  3150.     bne    @b
  3151.     move.l    (sp)+,a1
  3152.     moveq.l    #0,d0        *right!
  3153.     rts
  3154. not_same_dgscn2:
  3155.     move.l    d1,a2        *get back a2
  3156.     move.l    (sp)+,a1
  3157.     moveq.l    #-1,d0        *error!
  3158.     rts
  3159.  
  3160. set_fn2:            *ファイルネームのセット(case:juke box)
  3161.     * < a2.l=source        *拡張子省略したら拡張子セット
  3162.     * > d0.b=last chr
  3163.     bsr    skip_peri2
  3164.     movem.l    d1/a0,-(sp)
  3165.     lea    filename(pc),a0
  3166.     clr.b    d1
  3167. setfn2lp:
  3168.     move.b    (a2)+,d0
  3169.     cmpi.b    #'.',d0
  3170.     bne    chk_sp_2
  3171.     st.b    d1
  3172. chk_sp_2:
  3173.     cmpi.b    #' ',d0
  3174.     bls    exit_setfn2
  3175.     cmpi.b    #',',d0
  3176.     beq    exit_setfn2
  3177.     move.b    d0,(a0)+
  3178.     bra    setfn2lp
  3179. exit_setfn2:
  3180.     tst.b    d1        *拡張子省略かどうか
  3181.     bne    set_edc_2    *省略しなかった
  3182.     move.b    #'.',(a0)+    *拡張子をセット
  3183.     move.b    #'Z',(a0)+
  3184.     move.b    #'M',(a0)+
  3185.     move.b    #'D',(a0)+
  3186. set_edc_2:
  3187.     clr.b    (a0)
  3188.     movem.l    (sp)+,d1/a0
  3189.     rts
  3190.  
  3191. set_stup:
  3192.     * < a2.l=command line address
  3193.     * > d0.b=last chr
  3194.     * X a0
  3195.     move.l    sfp(pc),a0
  3196. setsulp:
  3197.     move.b    (a2)+,d0
  3198.     cmpi.b    #' ',d0
  3199.     bls    exit_setsu
  3200.     cmpi.b    #',',d0
  3201.     beq    exit_setsu
  3202.     move.b    d0,(a0)+
  3203.     bra    setsulp
  3204. exit_setsu:
  3205.     clr.b    (a0)
  3206.     rts
  3207.  
  3208. m_stop:                *演奏停止
  3209.     bsr    chk_drv        *ドライバ常駐チェック
  3210.     bmi    no_drv        *ドライバが組み込まれてない
  3211.  
  3212.     bsr    chk_num    *数字?
  3213.     bpl    trk_stop
  3214.  
  3215.     suba.l    a1,a1        *m_stop_all
  3216.     Z_MUSIC    #ZM_STOP    *m_stop
  3217.     bra    exit
  3218.  
  3219. trk_stop:
  3220.     bsr    get_trk_seq    *> a1.l=track_seqtbl
  3221.     Z_MUSIC    #ZM_STOP
  3222.     bra    exit
  3223.  
  3224. m_cont:                *演奏停止
  3225.     bsr    chk_drv        *ドライバ常駐チェック
  3226.     bmi    no_drv        *ドライバが組み込まれてない
  3227.  
  3228.     bsr    chk_num    *数字?
  3229.     bpl    trk_cont
  3230.  
  3231.     suba.l    a1,a1        *m_cont_all
  3232.     Z_MUSIC    #ZM_CONT    *m_cont
  3233.     bra    exit
  3234.  
  3235. trk_cont:
  3236.     bsr    get_trk_seq    *> a1.l=track_seqtbl
  3237.     Z_MUSIC    #ZM_CONT
  3238.     bra    exit
  3239.  
  3240. fadeout:            *fadeout
  3241.     bsr    chk_drv        *ドライバ常駐チェック
  3242.     bmi    no_drv        *ドライバが組み込まれてない
  3243.  
  3244.     bsr    chk_num        *数字?
  3245.     bpl    get_f_spd
  3246.     move.w    #$00_80,d2        *end=$00,start=$80
  3247.     moveq.l    #fader_dflt_spd,d1    *deafult speed
  3248.     bra    gfs00
  3249.  
  3250. get_f_spd:
  3251.     bsr    get_num
  3252.     move.w    #$00_80,d2        *end=$00,start=$80
  3253.     tst.l    d1
  3254.     bne    @f
  3255.     move.w    #$80_80,d2
  3256.     bra    gfs00
  3257. @@:
  3258.     bpl    @f
  3259.     neg.l    d1
  3260.     move.w    #$80_00,d2        *end=$80,start=$00
  3261. @@:
  3262.     cmpi.l    #255,d1            *check speed
  3263.     bhi    illegal_fader_speed
  3264. gfs00:
  3265.     lea    track_seqtbl(pc),a1    *param. tbl
  3266.     move.l    a1,a0
  3267.     move.w    #-1,(a0)+        *all
  3268.     move.b    #%0000_0111,(a0)+
  3269.     move.b    d1,(a0)+
  3270.     clr.b    (a0)+
  3271.     move.b    d2,(a0)+        *start level
  3272.     rol.w    #8,d2            *end level
  3273.     move.b    d2,(a0)+
  3274.     Z_MUSIC    #ZM_MASTER_FADER
  3275.     bra    exit
  3276.  
  3277.     dc.b    '独立'
  3278. zmint_entry:
  3279.     move.l    a0,-(sp)
  3280.     lea    zmint_count(pc),a0
  3281.     addq.l    #1,(a0)
  3282.     move.l    (sp)+,a0
  3283.     rts
  3284.  
  3285. self_record:
  3286.     bsr    chk_drv        *ドライバ常駐チェック
  3287.     bmi    no_drv        *ドライバが組み込まれてない
  3288.     st.b    self_rec_mode-zp_work(a6)
  3289.     move.w    #RTS,exit-zp_work(a6)
  3290.     bsr    cache_flush
  3291.     move.l    a2,reg_buf-zp_work(a6)
  3292.     bra    1f
  3293.  
  3294. midi_input:            *MIDIデータの取り込み
  3295.     * < a2.l=command line address
  3296.     bsr    chk_drv        *ドライバ常駐チェック
  3297.     bmi    no_drv        *ドライバが組み込まれてない
  3298.     clr.b    self_rec_mode-zp_work(a6)
  3299. m_oplp00:
  3300.     move.b    (a2)+,d0
  3301.     bne    @f
  3302. 1:
  3303.     lea    dummy_bmd(pc),a2    *ダミーファイルネーム
  3304.     bra    1f
  3305. @@:
  3306.     cmpi.b    #' ',d0
  3307.     bls    m_oplp00
  3308.     subq.w    #1,a2
  3309. 1:
  3310.     lea    MID_kaku(pc),a1
  3311.     bsr    set_fn
  3312.  
  3313.     lea    filename(pc),a0
  3314.     lea    bmdoutname(pc),a1
  3315. @@:
  3316.     move.b    (a0)+,(a1)+
  3317.     bne    @b
  3318.  
  3319.     move.l    #192*65536+200,d1    *mst_clk=192,テンポ=200
  3320.     lea    zmint_entry(pc),a1
  3321.     Z_MUSIC    #ZM_SET_INT_SERVICE
  3322.     tst.l    d0
  3323.     bne    other_prog        *既に他のプログラムが使用中
  3324.     st.b    ocpy_int_service-zp_work(a6)
  3325.  
  3326.     pea    $ffff.w            *最大確保
  3327.     DOS    _MALLOC
  3328.     addq.w    #4,sp
  3329.     andi.l    #$00ffffff,d0
  3330.     tst.b    self_rec_mode-zp_work(a6)
  3331.     beq    @f
  3332.     lsr.l    #1,d0            *自己記録モード時は最大メモリの半分を確保
  3333. @@:                    *(残りは演奏曲データバッファ用として取っておく)
  3334.     move.l    d0,d4
  3335.     move.l    d0,-(sp)
  3336.     DOS    _MALLOC
  3337.     addq.l    #4,sp
  3338.     move.l    d0,midi_rec_buf-zp_work(a6)
  3339.     bmi    out_mem
  3340.     move.l    d0,a4            *バッファアドレス
  3341.     add.l    a4,d4            *最終アドレス
  3342.     move.l    #'MThd',(a4)+        *header
  3343.     move.l    #$0000_0006,(a4)+    *header size
  3344.     move.l    #$0000_0001,(a4)+    *format 0
  3345.     move.w    #$0030,(a4)+        *分解能48
  3346.     move.l    #'MTrk',(a4)+        *track header
  3347.     clr.l    (a4)+
  3348.  
  3349.     lea    rec_st_mes(pc),a1
  3350.     bsr    bil_prta1
  3351.  
  3352.     moveq.l    #-1,d1            *move.l    if_number(pc),d1    *I/F number 0-2,-1
  3353.     Z_MUSIC    #ZM_MIDI_REC
  3354.     lea    zmint_count(pc),a1
  3355.     move.l    (a1),d3            *初期値
  3356.     move.l    d3,d6
  3357.     moveq.l    #0,d5            *work reg.(最上位ビットはあふれフラグとして使用)
  3358.     moveq.l    #0,d7
  3359.     move.l    #$00ff_5103,(a4)+    *テンポイベント
  3360.     move.w    #$0493,(a4)+        *$0493e0=tempo 200
  3361.     move.b    #$e0,(a4)+
  3362.     move.l    a4,a2
  3363.     clr.b    (a4)+            *delta=00
  3364.     move.l    #$f7_8080_80,(a4)+    *event=$f7,count.hw=$8080,count.lw=$80_**
  3365.     clr.b    (a4)+            *count.lw=$**_00
  3366.     move.l    a4,a3
  3367. minplp00:                *SMF作成ルーチンスタート
  3368.     moveq.l    #-1,d2
  3369.     tst.b    self_rec_mode-zp_work(a6)
  3370.     beq    @f
  3371.     bmi    1f
  3372.     movem.l    d1/a0-a1,-(sp)
  3373.     moveq.l    #0,d1
  3374.     move.l    d1,a1            *d1=a1=0
  3375.     Z_MUSIC    #ZM_PLAY_STATUS
  3376.     movem.l    (sp)+,d1/a0-a1
  3377.     move.l    d0,d2            *1:演奏中 0:演奏終了
  3378.     bra    @f
  3379. 1:
  3380.     bclr.b    #7,self_rec_mode-zp_work(a6)
  3381.     movem.l    d0-d7/a0-a6,-(sp)
  3382.     move.l    reg_buf(pc),a2
  3383.     bsr    m_play
  3384.     move.w    #NOP,exit-zp_work(a6)
  3385.     bsr    cache_flush
  3386.     movem.l    (sp)+,d0-d7/a0-a6
  3387. @@:
  3388.     bitsns    $0
  3389.     btst.l    #1,d0
  3390.     bne    rec_exit
  3391.     move.l    (a1),d0
  3392.     sub.l    d3,d0            *デルタタイム発生か
  3393. *    beq    1f
  3394.                     *デルタタイム発生
  3395.     tst.l    d7            *データ有ったか
  3396.     bne    @f
  3397.                     *データがないならば
  3398.     add.l    d3,d0            *元通りにして
  3399.     move.l    d6,d3            *前のタイマ値にして
  3400.     move.l    a2,a4            *アドレスも戻して
  3401.     sub.l    d3,d0            *デルタタイム再計算
  3402.     tst.l    d2
  3403.     bne    set_delta
  3404.     cmp.l    #192,d0            *演奏が終了してなんのデータ受信もないならば
  3405.     bhi    rec_exit        *しばらくして受信処理自動終了
  3406.     bra    set_delta
  3407. @@:
  3408.     moveq.l    #4-1,d1            *データカウント数書き込み
  3409. @@:
  3410.     move.l    d7,d2
  3411.     andi.b    #$7f,d2
  3412.     or.b    d2,-(a3)
  3413.     lsr.l    #7,d7
  3414.     dbra    d1,@b
  3415. set_delta:
  3416.     move.l    a4,a2            *preserve
  3417.     bsr    setval            *set delta time
  3418.     move.l    d3,d6            *preserve
  3419.     add.l    d0,d3
  3420.     cmp.l    a4,d4
  3421.     bls    out_mem
  3422.     move.b    #$f7,(a4)+        *F7 Stat
  3423.     cmp.l    a4,d4
  3424.     bls    out_mem
  3425.     move.b    #$80,(a4)+        *length
  3426.     cmp.l    a4,d4
  3427.     bls    out_mem
  3428.     move.b    #$80,(a4)+
  3429.     cmp.l    a4,d4
  3430.     bls    out_mem
  3431.     move.b    #$80,(a4)+
  3432.     cmp.l    a4,d4
  3433.     bls    out_mem
  3434.     clr.b    (a4)+
  3435.     move.l    a4,a3            *backup
  3436.     moveq.l    #0,d7            *count
  3437. 1:
  3438.     moveq.l    #-1,d1            *move.l    if_number(pc),d1    *I/F number 0-2,-1
  3439.     moveq.l    #0,d2            *MIDI_INP1 (single mode ID)
  3440.     Z_MUSIC    #ZM_MIDI_INP1
  3441.     tst.w    d0            *データ無し
  3442.     bmi    minplp00
  3443.     tst.l    d0
  3444.     bpl    @f
  3445.     bset.l    #31,d5            *dropマーク
  3446. @@:                    *データ有り
  3447.     cmp.l    a4,d4
  3448.     bls    out_mem
  3449.     move.b    d0,(a4)+
  3450.     addq.l    #1,d7
  3451.     bra    minplp00
  3452. rec_exit:
  3453.     move.l    (a1),d0
  3454.     sub.l    d3,d0            *d0.l=delta
  3455. *!2/10    beq    1f
  3456.                     *デルタタイム発生
  3457.     tst.l    d7            *データ有ったか
  3458.     bne    @f
  3459.                     *データがないならば
  3460.     add.l    d3,d0            *元通りにして
  3461.     move.l    d6,d3            *前のタイマ値にして
  3462.     move.l    a2,a4            *アドレスも戻して
  3463.     sub.l    d3,d0            *デルタタイム再計算
  3464.     bra    1f
  3465. @@:
  3466.     moveq.l    #4-1,d1            *データカウント数書き込み
  3467. @@:
  3468.     move.l    d7,d2
  3469.     andi.b    #$7f,d2
  3470.     or.b    d2,-(a3)
  3471.     lsr.l    #7,d7
  3472.     dbra    d1,@b
  3473. 1:                    *end of track書き込み
  3474.     move.l    a4,a2            *preserve
  3475.     bsr    setval
  3476.     cmp.l    a4,d4
  3477.     bls    out_mem
  3478.     st.b    (a4)+            *#$ff
  3479.     cmp.l    a4,d4
  3480.     bls    out_mem
  3481.     move.b    #$2f,(a4)+
  3482.     cmp.l    a4,d4
  3483.     bls    out_mem
  3484.     clr.b    (a4)+            *$00
  3485.     move.l    a4,a2
  3486.     bsr    init_kbuf
  3487.  
  3488.     moveq.l    #0,d1
  3489.     lea    zmint_entry(pc),a1
  3490.     Z_MUSIC    #ZM_SET_INT_SERVICE
  3491.     clr.b    ocpy_int_service-zp_work(a6)
  3492.  
  3493.     tst.l    d5
  3494.     bmi    data_drop_err        *読みこぼした
  3495.  
  3496.     moveq.l    #-1,d1            *move.l    if_number(pc),d1
  3497.     Z_MUSIC    #ZM_MIDI_REC_END
  3498.  
  3499.     bsr    optmz_rcdt0
  3500.  
  3501.     move.l    midi_rec_buf(pc),a4
  3502.     sub.l    a4,a2        *data count
  3503.     move.l    a2,d0
  3504.     cmpi.l    #22+7,d0    *#22=header size分,#7=tempo size分
  3505.     bls    no_data_rec    *なにも記録されていない
  3506.     sub.l    #22,d0
  3507.     move.l    d0,18(a4)    *track data length
  3508.                 *ファイルの書き出し
  3509.     lea    saving_mes(pc),a1    *書き出し中
  3510.     bsr    bil_prta1
  3511.     lea    bmdoutname(pc),a1
  3512.     bsr    prta1
  3513.     lea    CRLF(pc),a1
  3514.     bsr    prta1
  3515.  
  3516.     move.w    #32,-(sp)
  3517.     pea    bmdoutname(pc)
  3518.     DOS    _CREATE
  3519.     addq.w    #6,sp
  3520.     move.l    d0,d5        *d5.w=file handle
  3521.     bmi    write_err
  3522.  
  3523.     pea    (a2)        *data size
  3524.     pea    (a4)        *data addr
  3525.     move.w    d5,-(sp)
  3526.     DOS    _WRITE
  3527.     lea    10(sp),sp
  3528.     cmp.l    a2,d0
  3529.     bne    write_err
  3530.  
  3531.     move.w    d5,-(sp)
  3532.     DOS    _CLOSE
  3533.     addq.w    #2,sp
  3534.  
  3535.     bra    exit
  3536.  
  3537. optmz_rcdt0:                *データ最適化 PASS1
  3538.     * < a2.l=end addr
  3539.     * > a2.l=end addr
  3540.     move.l    a2,d4            *データの最後尾
  3541.     move.l    midi_rec_buf(pc),a4    *src
  3542.     add.w    #22+7,a4        *#22=header size分,#7=tempo size分
  3543.     move.l    a4,a2            *dest
  3544. minpoptlp:                *最適化処理
  3545.     cmp.l    a4,d4
  3546.     bls    1f
  3547.     bsr    getval
  3548.     bsr    setval2        *delta time
  3549.     move.b    (a4)+,d0
  3550.     move.b    d0,(a2)+    *event
  3551.     cmpi.b    #$ff,d0
  3552.     bne    @f
  3553.     move.b    (a4)+,(a2)+    *meta event number
  3554. @@:
  3555.     bsr    getval
  3556.     bsr    setval2        *count
  3557.     tst.l    d0
  3558.     beq    minpoptlp
  3559. @@:
  3560.     move.b    (a4)+,(a2)+
  3561.     subq.l    #1,d0
  3562.     bne    @b
  3563.     bra    minpoptlp
  3564. 1:
  3565.     rts
  3566.  
  3567. getval:
  3568.     * > d0.l=data
  3569.     * - all
  3570.     move.l    d1,-(sp)
  3571.     moveq.l    #0,d0
  3572.     moveq.l    #0,d1
  3573.     move.b    (a4)+,d1
  3574.     bpl    1f
  3575. @@:
  3576.     andi.b    #$7f,d1
  3577.     or.b    d1,d0
  3578.     lsl.l    #7,d0
  3579.     move.b    (a4)+,d1
  3580.     bmi    @b
  3581. 1:
  3582.     or.b    d1,d0
  3583.     move.l    (sp)+,d1
  3584.     rts
  3585.  
  3586. setval:
  3587.     * < d0.l=data
  3588.     * - all
  3589.     movem.l    d0-d1,-(sp)
  3590.     moveq.l    #4-1,d1
  3591.     rol.l    #4,d0
  3592. 1:
  3593.     rol.l    #7,d0
  3594.     andi.b    #$7f,d0
  3595.     bne    @f
  3596.     tst.l    d1
  3597.     bgt    2f
  3598. @@:
  3599.     bset.l    #31,d1
  3600.     tst.w    d1
  3601.     beq    @f
  3602.     tas.b    d0
  3603. @@:
  3604.     cmp.l    a4,d4
  3605.     bls    out_mem
  3606.     move.b    d0,(a4)+
  3607. 2:
  3608.     dbra    d1,1b
  3609.     movem.l    (sp)+,d0-d1
  3610.     rts
  3611.  
  3612. setval2:
  3613.     * < d0.l=data
  3614.     * - all
  3615.     movem.l    d0-d1,-(sp)
  3616.     moveq.l    #4-1,d1
  3617.     rol.l    #4,d0
  3618. 1:
  3619.     rol.l    #7,d0
  3620.     andi.b    #$7f,d0
  3621.     bne    @f
  3622.     tst.l    d1
  3623.     bgt    2f
  3624. @@:
  3625.     bset.l    #31,d1
  3626.     tst.w    d1
  3627.     beq    @f
  3628.     tas.b    d0
  3629. @@:
  3630.     move.b    d0,(a2)+
  3631. 2:
  3632.     dbra    d1,1b
  3633.     movem.l    (sp)+,d0-d1
  3634.     rts
  3635.  
  3636. init_kbuf:            *キーバッファクリア
  3637.     move.l    d0,-(sp)
  3638.     clr.w    -(sp)
  3639.     DOS    _KFLUSH
  3640.     addq.w    #2,sp
  3641.     move.l    (sp)+,d0
  3642.     rts
  3643.  
  3644. midi_send:            *MIDIデータの楽器への転送
  3645.     * < a2.l=command line address
  3646.     bsr    chk_drv        *ドライバ常駐チェック
  3647.     bmi    no_drv        *ドライバが組み込まれてない
  3648. m_sdlp00:
  3649.     move.b    (a2)+,d0
  3650.     beq    print_hlp    *ファイル名無しの場合は…
  3651.     cmpi.b    #' ',d0
  3652.     bls    m_sdlp00
  3653.     subq.w    #1,a2
  3654.  
  3655.     lea    MID_kaku(pc),a1
  3656.     bsr    set_fn
  3657.  
  3658.     lea    trns_mes(pc),a1
  3659.     bsr    bil_prta1
  3660.  
  3661.     lea    filename(pc),a2
  3662.     bsr    fopen
  3663.     tst.l    d5
  3664.     bmi    file_not_found
  3665.     bsr    read
  3666.     lea    MIDI(pc),a2
  3667.     pea    exit(pc)
  3668.  
  3669. self_output:
  3670.     * < a2=output device name
  3671.     * < d3=size
  3672.     * < a5=data address
  3673.     * - all
  3674. reglist    reg    d0/d5/a0-a1
  3675.     movem.l    reglist,-(sp)
  3676.  
  3677.     moveq.l    #ZM_COMPILER,d1
  3678.     lea    -1.w,a1            *detect mode
  3679.     Z_MUSIC    #ZM_HOOK_FNC_SERVICE
  3680.     move.l    a0,d0
  3681.     bne    @f            *常駐しているコンパイラを利用
  3682.     lea    MIDI(pc),a0
  3683.     cmp.l    a2,a0
  3684.     beq    @f            *'MIDI'や
  3685.     cmp.b    #$1a,(a5)        *オブジェクトならば自己出力
  3686.     bls    @f
  3687.     bsr    compile_zms        *ZMSならばコンパイラでコンパイル
  3688. @@:                    *< d3:data size,a5=data address
  3689.     move.w    #%0_000_01,-(sp)    *zmusicへ出力しちゃう
  3690.     pea    (a2)
  3691.     DOS    _OPEN
  3692.     addq.w    #6,sp
  3693.     move.l    d0,d5        *d5.w=file handle
  3694.  
  3695.     move.l    d3,-(sp)    *size
  3696.     pea    (a5)        *data address
  3697.     move.w    d5,-(sp)
  3698.     DOS    _WRITE
  3699.     lea    10(sp),sp
  3700.  
  3701.     move.w    d5,-(sp)
  3702.     DOS    _CLOSE
  3703.     addq.w    #2,sp
  3704.  
  3705.     movem.l    (sp)+,reglist
  3706.     rts
  3707.  
  3708. compile_zms:                *アドレス指定によるコンパイル
  3709.     * < (filename0)には便宜上のソースファイル名
  3710.     * < a5.l=zms address
  3711.     * < d3.l=size
  3712.     * > a5.l=zmd address
  3713.     * > d3.l=size
  3714. reglist    reg    d0-d2/a0-a2
  3715.     movem.l    reglist,-(sp)
  3716.  
  3717.     moveq.l    #ZM_COMPILER,d1
  3718.     lea    -1.w,a1            *detect mode
  3719.     Z_MUSIC    #ZM_HOOK_FNC_SERVICE
  3720.     move.l    a0,d0
  3721.     bne    use_linked_compiler
  3722.  
  3723.     bsr    make_temp_name
  3724.  
  3725.     move.w    d0,-(sp)
  3726.     DOS    _CLOSE
  3727.     addq.w    #2,sp
  3728.  
  3729.     lea    zmc_cmd(pc),a1
  3730.     move.l    #'ZMC ',(a1)+
  3731.     tst.b    lang-zp_work(a6)
  3732.     beq    @f
  3733.     move.b    #'-',(a1)+
  3734.     move.b    #'J',(a1)+
  3735.     move.b    #' ',(a1)+
  3736. @@:
  3737.     moveq.l    #-1,d1
  3738.     Z_MUSIC    #ZM_ZMUSIC_MODE
  3739.     cmpi.l    #2,d0
  3740.     bne    @f
  3741. *    tst.b    v2_compatch-zp_work(a6)
  3742. *    beq    @f
  3743.     move.b    #'-',(a1)+
  3744.     move.b    #'2',(a1)+
  3745.     move.b    #' ',(a1)+
  3746. @@:
  3747.     move.b    #'-',(a1)+        *なし
  3748.     move.b    #'G',(a1)+
  3749.     move.b    #' ',(a1)+
  3750.     move.b    #'-',(a1)+
  3751.     move.b    #'!',(a1)+
  3752.     move.l    a5,d0
  3753.     bsr    num_to_str        *address
  3754.     lea    suji(pc),a0
  3755. @@:
  3756.     move.b    (a0)+,(a1)+
  3757.     bne    @b
  3758.     move.b    #',',-1(a1)        *区切りspc
  3759.     move.l    d3,d0
  3760.     bsr    num_to_str        *address
  3761.     lea    suji(pc),a0
  3762. @@:
  3763.     move.b    (a0)+,(a1)+
  3764.     bne    @b
  3765.     move.b    #' ',-1(a1)        *区切りspc
  3766. zz:
  3767.     move.l    filename0(pc),a0
  3768. @@:
  3769.     move.b    (a0)+,(a1)+
  3770.     bne    @b            *ソースファイル名(便宜上)
  3771.  
  3772.     move.b    #' ',-1(a1)        *区切りspc
  3773.  
  3774.     lea    temp_name(pc),a0
  3775. @@:
  3776.     move.b    (a0)+,(a1)+
  3777.     bne    @b            *オブジェクト名
  3778.  
  3779.     bsr    call_zmc
  3780.     tst.l    d0
  3781.     bne    err_in_zmc        *コンパイル失敗
  3782.  
  3783.     pea    (a5)            *ZMSは捨てる
  3784.     DOS    _MFREE
  3785.     addq.w    #4,sp
  3786.  
  3787.     lea    temp_name(pc),a2
  3788.     bsr    fopen
  3789.     tst.l    d5
  3790.     bmi    temp_file_err
  3791.     bsr    read            *> d3:data size,a5=data address
  3792.  
  3793.     pea    temp_name(pc)
  3794.     DOS    _DELETE            *テンポラリ削除
  3795.     addq.w    #4,sp
  3796.  
  3797.     clr.b    temp_flg-zp_work(a6)
  3798.  
  3799.     movem.l    (sp)+,reglist
  3800.     rts
  3801.  
  3802. use_linked_compiler:            *常駐中のコンパイラを使ってZMSをコンパイル
  3803.     moveq.l    #0,d1
  3804.     move.l    d3,d2
  3805.     move.l    a5,a1
  3806.     Z_MUSIC    #ZM_COMPILER        *コンパイル実行ルーチンへ
  3807.     tst.l    d0
  3808.     bne    err_in_zmc        *エラーがあった
  3809.     move.l    a0,d0
  3810.     beq    err_in_zmc        *エラーがあった
  3811.     move.l    a0,a5            *zmd address
  3812.     moveq.l    #0,d3            *zmd dummy size
  3813.  
  3814.     pea    (a1)            *ZMSは捨てる
  3815.     DOS    _MFREE
  3816.     addq.w    #4,sp
  3817.  
  3818.     move.l    a0,a1
  3819.     Z_MUSIC    #ZM_CALC_TOTAL
  3820.  
  3821.     tst.l    d0            *97/4/16
  3822.     bne    @f            *なんらかのエラーが発生したので計算は行なわれなかった
  3823.     move.l    a0,a1
  3824.     Z_MUSIC    #ZM_FREE_MEM
  3825. @@:
  3826.     movem.l    (sp)+,reglist
  3827.     rts
  3828.  
  3829. call_calc_total:            *ステップタイム等の計算
  3830.     * < a1.l=zmd address
  3831.     * < d2.l=zmd size
  3832.     movem.l    d0/a0-a2,-(sp)
  3833.  
  3834.     lea    zmc_cmd(pc),a0
  3835.     move.l    #'ZMC ',(a0)+
  3836.     move.l    #'-#  ',(a0)+
  3837.     move.l    a1,d0
  3838.     bsr    num_to_str        *address
  3839.     lea    suji(pc),a1
  3840. @@:
  3841.     move.b    (a1)+,(a0)+
  3842.     bne    @b
  3843.     move.b    #',',-1(a0)        *区切りspc
  3844.  
  3845.     move.l    d2,d0
  3846.     bsr    num_to_str        *size
  3847.     lea    suji(pc),a1
  3848. @@:
  3849.     move.b    (a1)+,(a0)+
  3850.     bne    @b
  3851.     move.b    #' ',-1(a0)        *区切りspc
  3852.  
  3853.     lea    filename(pc),a1
  3854. @@:
  3855.     move.b    (a1)+,(a0)+
  3856.     bne    @b            *コンパイラの実行
  3857.  
  3858.     bsr    call_zmc
  3859.     tst.l    d0
  3860.     bne    err_in_zmc        *コンパイル失敗
  3861.  
  3862.     movem.l    (sp)+,d0/a0-a2
  3863.     rts
  3864.  
  3865. call_zmc:                *コンパイラの実行
  3866.     * < (zmc_cmd)=コマンドライン
  3867.     movem.l    d1-d7/a0-a7,reg_buf-zp_work(a6)
  3868.     clr.l    -(sp)
  3869.     pea    track_seqtbl(pc)    *使い捨てバッファ
  3870.     pea    zmc_cmd(pc)        *filename
  3871.     move.w    #2,-(sp)        *mode
  3872.     DOS    _EXEC
  3873.     tst.l    d0
  3874.     bmi    no_zmc_err        *ZMCがない
  3875.     addq.w    #2,sp
  3876.     clr.w    -(sp)            *mode
  3877.     DOS    _EXEC
  3878.     lea    14(sp),sp
  3879.     movem.l    reg_buf(pc),d1-d7/a0-a7
  3880.     rts
  3881.  
  3882. ZMS:        dc.b    'ZMS',0
  3883. MIDI:        dc.b    'MIDI',0
  3884.     .even
  3885.  
  3886. get_trk_seq:            *トラック番号を取得してテーブルへ
  3887.     * > a1.l=track_seqtbl
  3888.     * - all
  3889. reglist    reg    d1-d2
  3890.     movem.l    reglist,-(sp)
  3891.     lea    track_seqtbl(pc),a1
  3892.     moveq.l    #0,d2
  3893. bps_lp:
  3894.     bsr    chk_num
  3895.     bmi    exit_bps
  3896.     bsr    get_num
  3897.     subq.w    #1,d1
  3898.     cmpi.w    #tr_max-1,d1
  3899.     bhi    illegal_p
  3900.     addq.w    #1,d2
  3901.     cmpi.w    #128,d2
  3902.     bhi    too_many_trks
  3903.     move.w    d1,(a1)+
  3904.     bsr    skip_sep
  3905.     bra    bps_lp
  3906. exit_bps:
  3907.     move.w    #-1,(a1)+
  3908.     lea    track_seqtbl(pc),a1
  3909.     movem.l    (sp)+,reglist
  3910.     rts
  3911.  
  3912. skip_sep:            *セパレータを1個だけスキップする
  3913.     move.w    d0,-(sp)    *(スペース/タブ/改行は複数スキップする)
  3914. skip_sep_lp:
  3915.     move.b    (a2)+,d0
  3916.     cmpi.b    #' ',d0
  3917.     beq    skip_sep_lp
  3918.     cmpi.b    #09,d0
  3919.     beq    skip_sep_lp
  3920.     cmpi.b    #',',d0
  3921.     beq    exit_ssl
  3922.     subq.w    #1,a2
  3923. exit_ssl:
  3924.     move.w    (sp)+,d0
  3925.     rts
  3926.  
  3927. skip_spc:            *スペースをスキップする
  3928.     move.w    d0,-(sp)
  3929. @@:
  3930.     move.b    (a2)+,d0
  3931.     cmpi.b    #' ',d0
  3932.     beq    @b
  3933.     cmpi.b    #09,d0        *skip tab
  3934.     beq    @b
  3935.     subq.w    #1,a2
  3936. exit_skip_spc:
  3937.     move.w    (sp)+,d0
  3938.     rts
  3939.  
  3940. skip_plus:            *PLUSをスキップする
  3941.     cmpi.b    #'+',(a2)+
  3942.     beq    skip_plus
  3943.     subq.w    #1,a2
  3944.     rts
  3945.  
  3946. chk_kanji:
  3947.     tst.b    d0
  3948.     bpl    @f        *normal characters
  3949.     cmpi.b    #$a0,d0        *漢字か
  3950.     bcs    cknj_yes
  3951.     cmpi.b    #$df,d0
  3952.     bls    @f
  3953. cknj_yes:
  3954.     move.w    #CCR_NEGA,ccr    *yes
  3955.     rts
  3956. @@:
  3957.     move.w    #CCR_ZERO,ccr    *no
  3958.     rts
  3959.  
  3960. chk_num:            *数字かどうかチェック
  3961.     * > eq=number
  3962.     * > mi=not num
  3963.     move.l    d0,-(sp)
  3964.     bsr    skip_spc
  3965.     move.b    (a2),d0
  3966.     cmpi.b    #'%',d0
  3967.     beq    yes_num
  3968.     cmpi.b    #'$',d0
  3969.     beq    yes_num
  3970.     cmpi.b    #'-',d0
  3971.     beq    yes_num
  3972.     cmpi.b    #'+',d0
  3973.     beq    yes_num
  3974.     cmpi.b    #'0',d0
  3975.     bcs    not_num
  3976.     cmpi.b    #'9',d0
  3977.     bhi    not_num
  3978. yes_num:
  3979.     move.l    (sp)+,d0
  3980.     move.w    #CCR_ZERO,ccr
  3981.     rts
  3982. not_num:
  3983.     move.l    (sp)+,d0
  3984.     move.w    #CCR_NEGA,ccr
  3985.     rts
  3986.  
  3987. get_num:            *数字文字列を数値へ
  3988.     * < (a2)=number strings
  3989.     * > d1.l=value
  3990.     * > a2=next
  3991.     * - all
  3992. reglist    reg    d0/d2-d3
  3993.     bsr    skip_spc    *' ',tabなどをskip
  3994.     tst.b    (a2)
  3995.     beq    num_ret
  3996.     movem.l    reglist,-(sp)
  3997.     cmpi.b    #'-',(a2)
  3998.     seq    d2           *'-'ならマーク
  3999.     bne    get_num0
  4000.     addq.w    #1,a2        *skip '-'
  4001. get_num0:
  4002.     bsr    skip_plus
  4003.     bsr    skip_spc
  4004.  
  4005.     cmpi.b    #'$',(a2)
  4006.     beq    get_hexnum_
  4007.     cmpi.b    #'%',(a2)
  4008.     beq    get_binnum_
  4009.  
  4010.     moveq.l    #0,d1
  4011.     moveq.l    #0,d0
  4012. num_lp01:
  4013.     move.b    (a2)+,d0
  4014.     beq    num_exit
  4015. *    cmpi.b    #'_',d0
  4016. *    beq    num_lp01
  4017.     sub.b    #$30,d0
  4018.     bmi    num_exit
  4019.     cmp.b    #9,d0
  4020.     bhi    num_exit
  4021.  
  4022.     add.l    d1,d1
  4023.     move.l    d1,d3
  4024.     lsl.l    #2,d1
  4025.     add.l    d3,d1        *d1=d1*10
  4026.     add.l    d0,d1        *d1=d1+d0
  4027.     bra    num_lp01
  4028. num_exit:
  4029.     subq.w    #1,a2
  4030.     tst.b    d2
  4031.     beq    @f
  4032.     neg.l    d1
  4033. @@:
  4034.     movem.l    (sp)+,reglist
  4035. num_ret:
  4036.     rts
  4037. get_hexnum_:            *16進数
  4038.     moveq.l    #0,d0
  4039.     moveq.l    #0,d1
  4040.     tst.b    (a2)+
  4041.     beq    num_exit
  4042.     bsr    skip_spc
  4043. __num_lp01_:
  4044.     move.b    (a2)+,d0
  4045.     beq    num_exit
  4046. *    cmpi.b    #'_',d0
  4047. *    beq    __num_lp01_
  4048.     bsr    mk_capital
  4049.     sub.b    #$30,d0
  4050.     bmi    num_exit
  4051.     cmp.b    #9,d0
  4052.     bls    calc_hex_
  4053.     cmpi.b    #17,d0
  4054.     bcs    num_exit
  4055.     cmpi.b    #22,d0
  4056.     bhi    num_exit
  4057.     subq.b    #7,d0
  4058. calc_hex_:
  4059.     lsl.l    #4,d1
  4060.     or.b    d0,d1
  4061.     bra    __num_lp01_
  4062. get_binnum_:            *2進数
  4063.     moveq.l    #0,d0
  4064.     moveq.l    #0,d1
  4065.     tst.b    (a2)+
  4066.     beq    num_exit
  4067.     bsr    skip_spc
  4068. b__num_lp01_:
  4069.     move.b    (a2)+,d0
  4070.     beq    num_exit
  4071. *    cmpi.b    #'_',d0
  4072. *    beq    b__num_lp01_
  4073.     cmpi.b    #'0',d0
  4074.     beq    calc_b_num__
  4075.     cmpi.b    #'1',d0
  4076.     bne    num_exit
  4077. calc_b_num__:
  4078.     sub.b    #$30,d0
  4079.     add.l    d1,d1
  4080.     or.b    d0,d1
  4081.     bra    b__num_lp01_
  4082.  
  4083. mk_capital:            *小文字→大文字(英字以外の場合はそのままthrough out)
  4084.     * < d0.b=letter chr
  4085.     cmpi.b    #'a',d0
  4086.     bcs    exit_mkcptl
  4087.     cmpi.b    #'z',d0
  4088.     bhi    exit_mkcptl
  4089.     andi.w    #$df,d0        *わざと.w
  4090. exit_mkcptl:
  4091.     rts
  4092.  
  4093. fopen2:                *LZZ.Rの検索
  4094.     * > d5=file handle (error:d5<0)
  4095.     * - all 
  4096.     movem.l    d0-d2/a0-a3,-(sp)
  4097.  
  4098.     lea    lzz(pc),a0
  4099.     move.l    open_fn(pc),a1
  4100.     move.b    (a0)+,(a1)+
  4101.     move.b    (a0)+,(a1)+
  4102.     move.b    (a0)+,(a1)+
  4103.     move.b    (a0)+,(a1)+
  4104.     move.b    (a0)+,(a1)+
  4105.     move.b    (a0)+,(a1)+
  4106.     subq.w    #6,a0
  4107.  
  4108.     clr.w    -(sp)
  4109.     pea     (a0)
  4110.     DOS    _OPEN
  4111.     addq.w    #6,sp
  4112.     move.l    d0,d5        *d5.w=file handle
  4113.     bpl    exit_fopen    *no problem
  4114.  
  4115.     pea    path(pc)
  4116.     bsr    search_env
  4117.     addq.w    #4,sp
  4118.     tst.l    d0
  4119.     beq    exit_fopen
  4120.     move.l    d0,a1
  4121.     bra    fo0
  4122.  
  4123. make_temp_name:                *テンポラリファイルの名前を作成
  4124. reglist    reg    a0-a1
  4125.     movem.l    reglist,-(sp)
  4126.     lea    temp_name(pc),a1
  4127.  
  4128.     pea    temp_path(pc)
  4129.     bsr    search_env
  4130.     addq.w    #4,sp
  4131.     tst.l    d0
  4132.     beq    1f
  4133.     move.l    d0,a0
  4134. @@:
  4135.     move.b    (a0)+,(a1)+
  4136.     bne    @b
  4137.     subq.w    #1,a1
  4138.  
  4139.     cmpi.b    #'\',-1(a1)
  4140.     beq    1f
  4141.     move.b    #'\',(a1)+
  4142. 1:
  4143.     lea    temp_name_src(pc),a0
  4144. @@:
  4145.     move.b    (a0)+,(a1)+
  4146.     bne    @b
  4147.  
  4148.     subq.w    #1,a1
  4149.  
  4150.     move.w    #32,-(sp)
  4151.     pea    temp_name(pc)
  4152.     DOS    _MAKETMP        *tempファイル作成
  4153.     addq.w    #6,sp
  4154.  
  4155.     st.b    temp_flg-zp_work(a6)
  4156.  
  4157.     movem.l    (sp)+,reglist
  4158.     rts
  4159.  
  4160. work:    set    zp_work
  4161.     .include    fopen.has
  4162.  
  4163. read:
  4164.     * < d5.l=file handle
  4165.     * > a5=data address
  4166.     * > d3.l=size
  4167.     * X d0
  4168.     move.w    #2,-(sp)    *ファィルの長さを調べる
  4169.     clr.l    -(sp)
  4170.     move.w    d5,-(sp)
  4171.     DOS    _SEEK
  4172.      addq.w    #8,sp        *d0.l=file length
  4173.     move.l    d0,d3        *d3=true length
  4174.     ble    fsize0        *file size=0
  4175.     addq.l    #1,d0        *for end code
  4176.  
  4177.     move.l    d0,-(sp)
  4178.     DOS    _MALLOC
  4179.     addq.w    #4,sp
  4180.     tst.l    d0
  4181.     bmi    out_mem        *OUT OF MEMORY
  4182.     move.l    d0,a5
  4183.     clr.b    (a5,d3.l)    *endcode
  4184.  
  4185.     clr.w    -(sp)        *ファイルポインタを元に戻す
  4186.     clr.l    -(sp)
  4187.     move.w    d5,-(sp)
  4188.     DOS    _SEEK
  4189.     addq.w    #8,sp
  4190.  
  4191.     move.l    d3,-(sp)    *push size
  4192.     pea    (a5)        *push addr
  4193.     move.w    d5,-(sp)    *file handle
  4194.     DOS    _READ
  4195.     lea    10(sp),sp
  4196.     tst.l    d0
  4197.     bmi    read_err    *読み込み失敗
  4198.  
  4199.     move.w    d5,-(sp)    *close
  4200.     DOS    _CLOSE
  4201.     addq.l    #2,sp
  4202.     rts
  4203.  
  4204. key_bind_jk:
  4205.     movem.l    d0-d2/d4/a0/a4,-(sp)
  4206.  
  4207.     pea    zp_key(pc)
  4208.     bsr    search_env
  4209.     addq.w    #4,sp
  4210.     tst.l    d0
  4211.     beq    quit_zk_jk
  4212.  
  4213.     move.l    d0,a2
  4214.     lea    key_tbl_jk(pc),a0
  4215.     moveq.l    #14-1,d2
  4216. @@:
  4217.     bsr    get_num
  4218.     bsr    skip_sep
  4219.     ror.b    #4,d1
  4220.     move.b    d1,(a0)+
  4221.     dbra    d2,@b
  4222. quit_zk_jk:
  4223.     movem.l    (sp)+,d0-d2/d4/a0/a4
  4224.     rts
  4225.  
  4226. key_bind_db:
  4227.     movem.l    d0-d2/a0/a2,-(sp)
  4228.  
  4229.     pea    zp_key(pc)
  4230.     bsr    search_env
  4231.     addq.w    #4,sp
  4232.     tst.l    d0
  4233.     beq    quit_zk_db
  4234.  
  4235.     move.l    d0,a2
  4236.     lea    key_tbl_db(pc),a0
  4237.     moveq.l    #14-1,d2
  4238. @@:
  4239.     bsr    get_num
  4240.     bsr    skip_sep
  4241.     ror.b    #4,d1
  4242.     move.b    d1,(a0)+
  4243.     dbra    d2,@b
  4244. quit_zk_db:
  4245.     movem.l    (sp)+,d0-d2/a0/a2
  4246.     rts
  4247.  
  4248. chk_drv:
  4249.     * > eq=kept
  4250.     * > mi=error
  4251.     bsr    print_title
  4252.     move.l    $8c.w,a0
  4253.     subq.w    #8,a0
  4254.     cmpi.l    #'ZmuS',(a0)+
  4255.     bne    @f
  4256.     cmpi.w    #'iC',(a0)+
  4257.     bne    @f
  4258.     cmpi.b    #$30,(a0)+
  4259.     bcs    version_error
  4260.     move.l    #ID_ERROR,d3
  4261.     Z_MUSIC    #ZM_FREE_MEM2    *古いERROR、全部解放
  4262.     moveq.l    #0,d0
  4263.     rts
  4264. @@:
  4265.     moveq.l    #-1,d0
  4266.     rts
  4267.  
  4268. print_title:            *タイトル表示
  4269.     movem.l    d0/a1,-(sp)
  4270.     lea    title_mes(pc),a1
  4271.     bsr    prta1
  4272.     clr.b    title_mes-zp_work(a6)
  4273.     movem.l    (sp)+,d0/a1
  4274.     rts
  4275.  
  4276. other_prog:            *他のプログラムがZ-MUSIC割り込みを使用中
  4277.     lea    other_mes(pc),a1
  4278.     bra    exit2
  4279.  
  4280. occupied_unsuccessful:        *アプリケーション登録が出来なかった
  4281.     lea    occunsc_mes(pc),a1
  4282.     bra    exit2
  4283.  
  4284. print_hlp:            *簡易ヘルプ表示
  4285.     tst.b    no_error_mark-zp_work(a6)
  4286.     bne    exit
  4287.     bsr    print_title
  4288.     lea    hlp_mes(pc),a1
  4289.     bra    exit2
  4290.  
  4291. no_drv:                *ドライバが組み込まれていません
  4292.     lea    no_drv_mes(pc),a1
  4293.     bra    exit2
  4294.  
  4295. lzz_not_found:
  4296.     lea    lzz_nf_mes(pc),a1
  4297.     bra    exit2
  4298.  
  4299. cant_use_lzz:
  4300.     lea    cant_use_lzz_mes(pc),a1
  4301.     bra    exit2
  4302.  
  4303. lzz_err:
  4304.     lea    lzz_err_mes(pc),a1
  4305.     bra    exit2
  4306.  
  4307. illegal_p:
  4308.     lea    illegal_p_mes(pc),a1
  4309.     bra    exit2
  4310.  
  4311. too_many_trks:            *トラック番号が多すぎる
  4312.     lea    toomanytr_mes(pc),a1
  4313.     bra    exit2
  4314.  
  4315. fsize0:                *ファイルサイズがゼロ
  4316.     move.l    a2,a1        *filename
  4317.     bsr    print_fnm2
  4318.     lea    fsize0_mes(pc),a1
  4319.     bra    exit2
  4320.  
  4321. unid_error:            *未確認ファイル
  4322.     bsr    print_fnm
  4323.     lea    unid_mes(pc),a1
  4324.     bra    exit2
  4325.  
  4326. not_performance_data:        *演奏データではない
  4327.     bsr    print_fnm
  4328.     lea    notpfmdt_mes(pc),a1
  4329.     bra    exit2
  4330.  
  4331. unid_error_zdf:            *未確認ファイル(ZDF)
  4332.     bsr    print_fnm
  4333.     lea    unidzdf_mes(pc),a1
  4334.     bra    exit2
  4335.  
  4336. juke_error:            *既定外コマンドの使用
  4337.     bsr    print_fnm
  4338.     lea    juke_er_mes(pc),a1
  4339.     bra    exit2
  4340.  
  4341. out_mem:            *メモリ不足
  4342.     lea    out_mem_mes(pc),a1
  4343.     bra    exit2
  4344.  
  4345. read_err:            *読み込み失敗
  4346.     lea    read_err_mes(pc),a1
  4347.     bra    exit2
  4348.  
  4349. file_not_found2:
  4350.     lea    org_fn(pc),a2
  4351. file_not_found:            *ファイルが無い
  4352.     move.l    a2,a1        *filename
  4353.     bsr    print_fnm2
  4354.     lea    fnf_err_mes(pc),a1
  4355.     bra    exit2
  4356.  
  4357. illegal_fader_speed:            *データ多すぎ
  4358.     lea    fdr_spd_er_mes(pc),a1
  4359.     bra    exit2
  4360.  
  4361. version_error:                *バージョン番号不一致
  4362.     lea    version_mes(pc),a1
  4363.     bra    exit2
  4364.  
  4365. temp_file_err:            *テンポラリファイルが破壊された?
  4366.     lea    tempfiler_mes(pc),a1
  4367.     bra    exit2
  4368.  
  4369. no_zmc_err:            *コンパイラが見つからない
  4370.     lea    no_zmc_er_mes(pc),a1
  4371.     bra    exit2
  4372.  
  4373. err_in_zmc:            *コンパイラでエラーが発生
  4374.     lea    err_zmc_mes(pc),a1
  4375.     bra    exit2
  4376.  
  4377. err_in_calc:            *計算に失敗
  4378.     lea    err_calc_mes(pc),a1
  4379.     bra    exit2
  4380.  
  4381. interval_too_long:        *ジュークボックスのブランクタイムが長すぎる
  4382.     lea    itvl_lng_mes(pc),a1
  4383.     bra    exit2
  4384.  
  4385. data_drop_err:    
  4386.     lea    drop_er_mes(pc),a1
  4387.     bra    exit2
  4388.  
  4389. illegal_ch:            *チャンネルの指定がおかしい
  4390.     lea    illegal_ch_mes(pc),a1
  4391.     bra    exit2
  4392.  
  4393. illegal_if:            *インターフェースの指定がおかしい
  4394.     lea    illegal_if_mes(pc),a1
  4395.     bra    exit2
  4396.  
  4397. illegal_ver_mode:        *バージョン切り換え失敗
  4398.     lea    illegal_v_mes(pc),a1
  4399.     bra    exit2
  4400.  
  4401. no_data_rec:            *なにも受信されなかった
  4402.     lea    nul_rec_mes(pc),a1
  4403.     bra    exit2
  4404.  
  4405. too_many:            *データ多すぎ
  4406.     lea    too_many_mes(pc),a1
  4407.     bra    exit2
  4408.  
  4409. not_kep:            *JUKE BOXは常駐していない
  4410.     lea    not_kep_mes(pc),a1
  4411.     bra    exit2
  4412.  
  4413. jb_already:            *JUKE BOXは既に常駐しています
  4414.     lea    already_mes(pc),a1
  4415.     bra    exit2
  4416.  
  4417. write_err:            *書き出し失敗
  4418.     DOS    _ALLCLOSE
  4419.  
  4420.     pea    filename(pc)
  4421.     DOS    _DELETE
  4422.     addq.w    #4,sp
  4423.  
  4424.     lea    write_err_mes(pc),a1
  4425.     bra    exit2
  4426.  
  4427. print_err_code:                *エラーがあればそれらを表示
  4428.     tst.b    non_disp-zp_work(a6)
  4429.     bne    exit_pec        *表示なし
  4430.     moveq.l    #-1,d1
  4431.     Z_MUSIC    #ZM_STORE_ERROR        *>d0.l=n of err,a0.l=error tbl
  4432.     move.l    d0,d2            *n of err
  4433.     beq    exit_pec        *エラーなし
  4434.     move.l    a0,a5            *error tbl
  4435.     move.l    #$0001_0000,d1        *output into buffer
  4436.     move.b    lang(pc),d1        *language
  4437.     move.l    zmd_name(pc),a1        *zmdの名前
  4438.     suba.l    a2,a2            *sourceアドレスなし(今後対応するかも)
  4439.     move.l    zms_name(pc),a3        *zmsの名前
  4440.     Z_MUSIC    #ZM_PRINT_ERROR
  4441.     pea    (a0)            *非表示でも表示
  4442.     DOS    _PRINT
  4443.     addq.w    #4,sp
  4444.     move.l    a0,a1
  4445.     Z_MUSIC    #ZM_FREE_MEM
  4446.     move.l    a5,a1
  4447.     Z_MUSIC    #ZM_FREE_MEM
  4448. exit_pec:
  4449.     rts
  4450.  
  4451. print_fnm:
  4452.     lea    filename(pc),a1
  4453. print_fnm2:
  4454.     tst.b    non_disp-zp_work(a6)
  4455.     bne    @f
  4456.     move.w    #2,-(sp)
  4457.     pea    (a1)
  4458.     DOS    _FPUTS
  4459.     addq.w    #6,sp
  4460.  
  4461.     move.w    #2,-(sp)
  4462.     pea    chon(pc)
  4463.     DOS    _FPUTS
  4464.     addq.w    #6,sp
  4465. @@:
  4466.     rts
  4467.  
  4468. bil_prta1:                *日本語対応
  4469.     tst.b    lang-zp_work(a6)    *0:英語か 1:日本語か
  4470.     beq    prta1
  4471. @@:                    *次のメッセージをゲット
  4472.     tst.b    (a1)+
  4473.     bne    @b
  4474. prta1:                    *non_disp!=0のときはRTS
  4475.     * x d0.l
  4476.     move.w    #2,-(sp)
  4477.     pea    (a1)
  4478.     DOS    _FPUTS
  4479.     addq.w    #6,sp
  4480.     rts
  4481.  
  4482. num_to_str:    *レジスタの値を文字数列にする
  4483.     * < d0.l=value
  4484.     * > (suji)=ascii data
  4485.     * > (suji2)=ascii data
  4486.     * - all(except d0)
  4487.     movem.l    d1-d4/a0-a1,-(sp)
  4488.     clr.b    d4
  4489.     lea    suji(pc),a0
  4490.     lea    exp_tbl(pc),a1
  4491.     moveq.l    #10-1,d1
  4492. ex_loop0:
  4493.     moveq.l    #0,d2
  4494.     move.l    (a1)+,d3
  4495. ex_loop1:
  4496.     sub.l    d3,d0
  4497.     bcs    xbcd_str
  4498.     addq.b    #1,d2
  4499.     bra    ex_loop1
  4500. xbcd_str:
  4501.     add.l    d3,d0
  4502.     move.b    d2,d3
  4503.     or.b    d4,d3
  4504.     bne    nml_ktset
  4505. *    move.b    #$20,(a0)+
  4506.     bra    nml_lp_ope
  4507. nml_ktset:
  4508.     st    d4
  4509.     add.b    #'0',d2
  4510.     move.b    d2,(a0)+
  4511. nml_lp_ope:
  4512.     dbra    d1,ex_loop0
  4513.     lea    suji(pc),a1
  4514.     cmpa.l    a1,a0
  4515.     bne    @f
  4516.     move.b    #'0',(a0)+
  4517. @@:
  4518.     clr.b    (a0)        *end flg
  4519.                 *桁揃え処理
  4520.     sub.l    a1,a0        *a0=len
  4521.     move.l    a0,d0
  4522.     divu    #3,d0
  4523.     swap    d0
  4524.     lea    suji2(pc),a0
  4525.     subq.w    #1,d0
  4526.     bcs    soroe01
  4527. @@:
  4528.     move.b    (a1)+,(a0)+
  4529.     dbra    d0,@b
  4530. soroe01:
  4531.     swap    d0
  4532. soroelp:
  4533.     subq.w    #1,d0
  4534.     bcs    exit_soroe
  4535.     beq    @f
  4536.     move.b    #',',(a0)+
  4537. @@:
  4538.     move.b    (a1)+,(a0)+
  4539.     move.b    (a1)+,(a0)+
  4540.     move.b    (a1)+,(a0)+
  4541.     bra    soroelp
  4542. exit_soroe:
  4543.     clr.b    (a0)        *end code
  4544.     movem.l    (sp)+,d1-d4/a0-a1
  4545.     rts
  4546.  
  4547. get_hex32:            *値→16進数文字列(8bytes)
  4548.     * < d0=data value
  4549.     * > (a1)=suji(ascii numbers)
  4550.     * - all
  4551.     movem.l    d0-d1/d4/a1,-(sp)
  4552.     lea    suji+8(pc),a1
  4553.     clr.b    (a1)
  4554.     moveq.l    #8-1,d4
  4555. gh_lp32:
  4556.     move.b    d0,d1
  4557.     andi.b    #$0f,d1
  4558.     add.b    #$30,d1
  4559.     cmpi.b    #'9',d1
  4560.     bls    its_hex32
  4561.     addq.b    #7,d1
  4562. its_hex32:
  4563.     move.b    d1,-(a1)
  4564.     lsr.l    #4,d0
  4565.     dbra    d4,gh_lp32
  4566.     movem.l    (sp)+,d0-d1/d4/a1
  4567.     rts
  4568.  
  4569.     .data
  4570. zp_work:
  4571. title_mes:
  4572.     dc.b    'Z-MUSIC PLAYER '
  4573.     dc.b    $F3,'V',$F3,'E',$F3,'R',$F3,'S',$F3,'I',$F3,'O',$F3,'N'
  4574.     version
  4575.     test
  4576.     dc.b    ' (C) 1991,97 '
  4577.     dc.b    'ZENJI SOFT',13,10,0
  4578. hlp_mes:
  4579.     dc.b    '< USAGE > '
  4580.     dc.b    ' ZP3.R [COMMAND] [FILENAME][,SETUP-FILE1…4]',13,10
  4581.     dc.b    '< COMMAND SWITCHES >',13,10
  4582.     dc.b    '-a<filename>                   To record MIDI data and create SMF.',13,10
  4583.     dc.b    '-b<filename>[,setup1…4]       To include juke box function.',13,10
  4584.     dc.b    '-c[track number(s),…]         Make track(s) continue playing',13,10
  4585.     dc.b    '-d<MIDI I/F number>            Change the current MIDI interface.',13,10
  4586.     dc.b    '-E[channel(s),…]              Enable channel(s).',13,10
  4587.     dc.b    '-e[track number(s),…]         Enable track(s).',13,10
  4588.     dc.b    '-f[speed]                      Track fader control.',13,10
  4589.     dc.b    '                               Negative speed value makes fader up.',13,10
  4590.     dc.b    '-i                             Initialize Z-MUSIC and all instruments.',13,10
  4591.     dc.b    '-j                             Messages will be displayed in Japanese.',13,10
  4592.     dc.b    '-k                             To include performance control function.',13,10
  4593.     dc.b    '-M[channel(s),…]              Mask channel(s)',13,10
  4594.     dc.b    '-m[track number(s),…]         Mask track(s)',13,10
  4595.     dc.b    '-O[level[,channel(s),…]]      Set channel output level.',13,10
  4596.     dc.b    '-o[level[,track number(s),…]] Set track output level.',13,10
  4597.     dc.b    '-p[filename[,setup1…4]]       Start to play performance data(ZMD,ZMS,OPM,ZDF)',13,10
  4598.     dc.b    '-p[track number(s),…]         Make track(s) start playing',13,10
  4599.     dc.b    '-q[filename]                   Start to play performance data,',13,10
  4600.     dc.b    '                               and display the information about it.',13,10
  4601.     dc.b    '-r                             Release ZP3.R',13,10
  4602.     dc.b    '-s[track number(s),…]         Make track(s) stop playing',13,10
  4603.     dc.b    '-v<interval length>            Set blank time of juke box.',13,10
  4604.     dc.b    '-w[filename[,setup1…4]]       Start to play the performance data',13,10
  4605.     dc.b    '                               as soon as MIDI IN receives $FA.',13,10
  4606.     dc.b    '-x<filename>                   Send MIDI dump data to MIDI instrument(s).',13,10
  4607.     dc.b    '-y<filename>                   Record MIDI data and Start to play performance data',13,10
  4608.     dc.b    '                               at the same time.',13,10
  4609.     dc.b    0
  4610.     dc.b    '< 使用方法 > '
  4611.     dc.b    ' ZP3.R [コマンド] [ファイル名][,セットアップファイル1…4]',13,10
  4612.     dc.b    '< コマンドスイッチ >',13,10
  4613.     dc.b    '-a<ファイル名>                   MIDIデータを受信しSMFを作成する',13,10
  4614.     dc.b    '-b<ファイル名>[,セットアップファイル1…4] ジュークボックス機能を組み込む',13,10
  4615.     dc.b    '-c[トラック番号,…]              指定トラックの演奏を再開する',13,10
  4616.     dc.b    '-d<MIDI I/F number>              カレントMIDIインターフェースを指定する',13,10
  4617.     dc.b    '-E[チャンネル名,…]              チャンネルマスクを解除する',13,10
  4618.     dc.b    '-e[トラック番号,…]              トラックマスクを解除する',13,10
  4619.     dc.b    '-f[スピード]                     フェーダーを操作する。',13,10
  4620.     dc.b    '                                 負値のスピードはフェーダーを上げていく指定になる',13,10
  4621.     dc.b    '-i                               Z-MUSIC本体および接続中のデバイスを初期化する',13,10
  4622.     dc.b    '-j                               日本語メッセージ表示',13,10
  4623.     dc.b    '-k                               演奏制御機能を組み込む',13,10
  4624.     dc.b    '-M[チャンネル名,…]              指定チャンネルをマスクする',13,10
  4625.     dc.b    '-m[トラック番号,…]              指定トラックをマスクする',13,10
  4626.     dc.b    '-O[レベル[,チャンネル名,…]]     指定チャンネルの出力レベルを設定する',13,10
  4627.     dc.b    '-o[レベル[,トラック番号,…]]     指定トラックの出力レベルを設定する',13,10
  4628.     dc.b    '-p[ファイル名[,セットアップファイル1…4]] 指定ファイル(ZMD,ZMS,OPM,ZDF)の演奏を開始する',13,10
  4629.     dc.b    '-p[トラック番号,…]              指定トラックの演奏を開始する',13,10
  4630.     dc.b    '-q[ファイル名]                   指定ファイルの演奏を開始し演奏データのステータスを表示する',13,10
  4631.     dc.b    '-r                               ZP3.Rの常駐を解除する',13,10
  4632.     dc.b    '-s[トラック番号(s),…]           指定トラックの演奏を停止する',13,10
  4633.     dc.b    '-v<インターバルの長さ>           ジュークボックスのブランクタイムを設定する',13,10
  4634.     dc.b    '-w[ファイル名[,セットアップファイル1…4]] MIDI INが$FAを受信したと同時に演奏を開始する',13,10
  4635.     dc.b    '-x<ファイル名>                   MIDIダンプデータを送信する',13,10
  4636.     dc.b    '-y<ファイル名>                   レコーディング開始と同時に',13,10
  4637.     dc.b    '                                 指定ファイル(ZMD,ZMS,OPM,ZDF)の演奏を開始する',13,10
  4638.     dc.b    0
  4639. other_mes:    dc.b    'Z-MUSIC Interrapt Service has already been used by other applications.',13,10,0
  4640.         dc.b    'Z-MUSIC割り込みサービスは既に他のプログラムが利用中です',13,10,0
  4641. drop_er_mes:    dc.b    'MIDI receiver program dropped data.',13,10,0
  4642.         dc.b    'MIDI受信プログラムがデータを取りこぼしました',13,10,0
  4643. occunsc_mes:    dc.b    'Z-MUSIC refused ZP3.R registration.',13,10,0
  4644.         dc.b    'Z-MUSICにZP3.Rの登録を拒否されました',13,10,0
  4645. no_drv_mes:    dc.b    'Z-MUSIC is not included.',13,10,0
  4646.         dc.b    'Z-MUSICが組み込まれていません',13,10,0
  4647. fsize0_mes:    dc.b    'Illegal file size.',13,10,0
  4648.         dc.b    'ファイルサイズが異常です',13,10,0
  4649. itvl_lng_mes:    dc.b    'Blank time too long.',13,10,0
  4650.         dc.b    'ブランクタイムが長すぎます',13,10,0
  4651. illegal_p_mes:    dc.b    'Illegal parameter error.',13,10,0
  4652.         dc.b    '値が規定外です',13,10,0
  4653. illegal_ch_mes:    dc.b    'Illegal channel ID error.',13,10,0
  4654.         dc.b    'チャンネルIDが規定外です',13,10,0
  4655. illegal_if_mes:    dc.b    'Illegal interface ID error.',13,10,0
  4656.         dc.b    'インターフェースIDが規定外です',13,10,0
  4657. illegal_v_mes:    dc.b    'Fail in switching Z-MUSIC version mode.',13,10,0
  4658.         dc.b    'Z-MUSICバージョンモードの切り換えに失敗しました',13,10,0
  4659. toomanytr_mes:    dc.b    'Too many track numbers error.',13,10,0
  4660.         dc.b    'トラック番号が多すぎます',13,10,0
  4661. out_mem_mes:    dc.b    'Out of memory.',13,10,0
  4662.         dc.b    'メモリが不足しています',13,10,0
  4663. read_err_mes:    dc.b    'File read error.',13,10,0
  4664.         dc.b    'ファイルの読み込みに失敗しました',13,10,0
  4665. fnf_err_mes:    dc.b    'File not found.',13,10,0
  4666.         dc.b    'ファイルが見つかりませんでした',13,10,0
  4667. too_many_mes:    dc.b    'Too many filenames are written in index-file.',13,10,0
  4668.         dc.b    'インデックスファイル中に記述されたファイル名が多すぎます',13,10,0
  4669. unid_mes:    dc.b    'Unidentified file.',13,10,0
  4670.         dc.b    '認識できないファイルです',13,10,0
  4671. notpfmdt_mes:    dc.b    'This is not a performance data.',13,10,0
  4672.         dc.b    'これは演奏データではありません',13,10,0
  4673. unidzdf_mes:    dc.b    'Unidentified ZDF file.',13,10,0
  4674.         dc.b    '認識できないZDFファイルです',13,10,0
  4675. juke_er_mes:    dc.b    'This data contains an unsupportable external file reference.',13,10,0
  4676.         dc.b    '未対応の外部ファイル参照を含んでいます',13,10,0
  4677. version_mes:    dc.b    'Version number mismatch.',13,10,0
  4678.         dc.b    'バージョン番号が不一致です',13,10,0
  4679. midi_bd_mes:    dc.b    'MIDI is Unable to use.',13,10,0
  4680.         dc.b    'MIDIは使用できません',13,10,0
  4681. juke_mes:    dc.b    'Juke-box starts on a task.',13,10,0
  4682.         dc.b    'ジュークボックスを開始します',13,10,0
  4683. debug_mes:    dc.b    'Performance Control Function has been included.',13,10,0
  4684.         dc.b    '演奏制御機能が常駐しました',13,10,0
  4685. not_kep_mes:    dc.b    'ZP3.R is not kept in your system.',13,10,0
  4686.         dc.b    'ZP3.Rは常駐していません',13,10,0
  4687. already_mes:    dc.b    'ZP3.R has already been kept.',13,10,0
  4688.         dc.b    'ZP3.Rは既に常駐しています',13,10,0
  4689. lzz_nf_mes:    dc.b    "LZZ.R couldn't be found.",13,10,0
  4690.         dc.b    'LZZ.Rが見つかりません',13,10,0
  4691. cant_use_lzz_mes:    dc.b    "LZZ.R couldn't be used.",13,10,0
  4692.             dc.b    'LZZ.Rを利用することができませんでした',13,10,0
  4693. lzz_err_mes:    dc.b    "Error in LZZ.R.",13,10,0
  4694.         dc.b    'LZZ.R内でエラーが発生しました',13,10,0
  4695. write_err_mes:    dc.b    'File write error.',13,10,0
  4696.         dc.b    'ファイルの書き出しに失敗しました',13,10,0
  4697. fdr_spd_er_mes:    dc.b    'Illegal fader speed.',13,10,0
  4698.         dc.b    'フェーダースピードの値が異常です',13,10,0
  4699. tempfiler_mes:    dc.b    'Temporary file was broken.',13,10,0
  4700.         dc.b    'テンポラリファイルが異常です',13,10,0
  4701. no_zmc_er_mes:    dc.b    'Fail in execution of Z-MUSIC MML COMPILER.',13,10,0
  4702.         dc.b    'Z-MUSIC MMLコンパイラの起動に失敗しました',13,10,0
  4703. err_zmc_mes:    dc.b    'Error in execution of Z-MUSIC MML COMPILER.',13,10,0
  4704.         dc.b    'Z-MUSIC MMLコンパイラでエラーが発生しました',13,10,0
  4705. err_calc_mes:    dc.b    'Fail in a calculation of total step time.',13,10,0
  4706.         dc.b    'トータルステップタイムの計算に失敗しました',13,10,0
  4707. nul_rec_mes:    dc.b    'No data was received.',13,10,0
  4708.         dc.b    'データは受信されませんでした',13,10,0
  4709. rec_st_mes:    dc.b    'Recording start. Press [ESC] to stop.',13,10,0
  4710.         dc.b    '受信を開始します。[ESC]キーで終了します',13,10,0
  4711. saving_mes:    dc.b    'Now writing ',0
  4712.         dc.b    '現在加工保存処理実行中です',13,10,0
  4713. trns_mes:    dc.b    'Now transmitting.',13,10,0
  4714.         dc.b    '現在送信中です',13,10,0
  4715. v2_mode_mes:    dc.b    'Z-MUSIC switched to Ver.2.0 mode',13,10,0
  4716.         dc.b    'Z-MUSICはVer.2.0モードに切り替わりました',13,10,0
  4717. v3_mode_mes:    dc.b    'Z-MUSIC switched to Ver.3.0 mode',13,10,0
  4718.         dc.b    'Z-MUSICはVer.3.0モードに切り替わりました',13,10,0
  4719. crntmidiin:    dc.b    'Current MIDI Interface (IN)  : ',0
  4720.         dc.b    'カレントMIDIインターフェース (IN) : ',0
  4721. crntmidiout:    dc.b    '                       (OUT) : ',0
  4722.         dc.b    '                            (OUT) : ',0
  4723. none_mdif:    dc.b    'NOT READY',0
  4724. non_disp:    dc.b    0
  4725. chon:        dc.b    ' ... ',0
  4726. zp3_opt:    dc.b    'zp3_opt',0
  4727. zmsc3_fader:    dc.b    'zmsc3_fader',0
  4728. path:        dc.b    'path',0
  4729. lzz:        dc.b    'lzz.r',0
  4730. zp_key:        dc.b    'zp3_keyctrl',0
  4731. zp_juk:        dc.b    'zp3_jukectrl',0
  4732. dummy_bmd:    dc.b    'ZMUSIC.MID',0
  4733. *sep_:        dc.b    ':',0
  4734. *SPC2:        dc.b    '  ',0
  4735. CRLF:        dc.b    13,10,0
  4736. ext_tbl:
  4737. ZMD_kaku:    dc.b    'ZMD',0
  4738. ZMS_kaku:    dc.b    'ZMS',0
  4739. OPM_kaku:    dc.b    'OPM',0
  4740. ZDF_kaku:    dc.b    'ZDF',0
  4741. MID_kaku:    dc.b    'MID',0
  4742. MDD_kaku:    dc.b    'MDD',0
  4743. ZPD_kaku:    dc.b    'ZPD',0
  4744. JUK_kaku:    dc.b    'JUK',0
  4745. temp_name_src:    dc.b    'ZMSC????.ZMD',0
  4746. temp_path:    dc.b    'temp',0
  4747. adpcm_default_ch:    dc.b    0    *ADPCM CH 初期値
  4748. no_error_mark:        dc.b    0    *-1:正常にZP3.Rが終了したとみなしてよい
  4749. normal_play:        dc.b    0    *0:通常演奏,-1:効果音演奏
  4750. temp_flg:        dc.b    0    *テンポラリファイルの状態[0]:存在せず 1:存在する
  4751. *v2_compatch:        dc.b    0    *V2コンパチコンパイルか(0:no 1:yes)
  4752. ocpy_int_service:    dc.b    0    *ZM_SET_INT_SERVICEを占有したか([0]=no,1=yes)
  4753.     .even
  4754. exp_tbl:
  4755.     dc.l    1000000000
  4756.     dc.l    100000000
  4757.     dc.l    10000000
  4758.     dc.l    1000000
  4759.     dc.l    100000
  4760.     dc.l    10000
  4761.     dc.l    1000
  4762.     dc.l    100
  4763.     dc.l    10
  4764.     dc.l    1
  4765.  
  4766. zms_name:    dc.l    0
  4767. zmd_name:    dc.l    0
  4768. *if_number:    dc.l    -1        *MIDI入力のデフォルトインターフェース
  4769. zmint_count:    dc.l    0
  4770.     .bss
  4771. zpdfilename:
  4772. filename:    ds.b    fn_size
  4773. mddfilename:    ds.b    fn_size
  4774. setup_fn:    ds.b    fn_size*4
  4775. prog_name:    ds.b    fn_size
  4776. org_fn:        ds.b    fn_size
  4777. bmdoutname:    ds.b    fn_size
  4778. suji:        ds.b    11        *数値表示用
  4779. suji2:        ds.b    15        *数値表示用(桁揃え)
  4780. retry:        ds.b    1
  4781. self_rec_mode:    ds.b    1        *0:rec,1:self
  4782.     .even
  4783. zpd_scan:    ds.b    1    *0
  4784. mdd_scan:    ds.b    1    *1
  4785. mdd_dest_if:    ds.l    1    *2
  4786.  
  4787. preserve_d3d7a5:    ds.l    3
  4788. midi_rec_buf:        ds.l    1
  4789. open_fn:        ds.l    1
  4790. fopen_name:        ds.l    1
  4791. _common_buffer:        ds.l    1
  4792. env_bak:        ds.l    1
  4793. _seq_wk_tbl:        ds.l    1
  4794. zmd_addr:        ds.l    1
  4795. hozon_a5:        ds.l    1
  4796. last_zpd_addr:        ds.l    1
  4797. lzz_adr:        ds.l    1
  4798. bufadr:            ds.b    5*10+2
  4799. a2work:            ds.l    1
  4800. list_adr:        ds.l    1
  4801. track_seqtbl:        ds.w    (128+1)*3    *一応128トラック分確保
  4802. zmc_cmd:        ds.b    1024
  4803. temp_name:        ds.b    256        *dc.b    'ZMSC????.ZMD',0
  4804. ssp:            ds.l    1
  4805. sfp:            ds.l    1
  4806. mysp:            ds.l    1
  4807. filename0:        ds.l    1
  4808. reg_buf:        ds.l    16
  4809. zpdnm_buf:        ds.l    1
  4810. mddnm_buf:        ds.l    1
  4811. end_of_prog:
  4812.     .end    program_start
  4813.